C++基础知识—— 操作符/运算符

Posted 小米拍客光

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++基础知识—— 操作符/运算符相关的知识,希望对你有一定的参考价值。

前面已经学习了变量和常量,我们可以开始对它们进行操作,这就要用到C++的操作符。有些语言,很多操作符都是一些关键字, 比如add, equals等等。C++的操作符主要是由符号组成的。这些符号不在字母表中,但是在所有键盘上都可以找到。这个特点使得C++程序更简洁,也更国际化。运算符是C++语言的基础,所以非常重要。

    你不需要背下所有这一小节的内容,这些细节知识仅供你以后需要时参考 。

赋值Assignation (=)

赋值运算符的功能是将一个值赋给一个变量。

a = 5;

将整数5赋给变量a。= 运算符左边的部分叫做lvalue (left value),右边的部分叫做rvalue (right value)。lvalue 必须是一个变量,而右边的部分可以是一个常量,一个变量,一个运算(operation)的结果或是前面几项的任意组合。

有必要强调赋值运算符永远是将右边的值赋给左边,永远不会反过来。

a = b;

将变量b (rvalue)的值赋给变量a (lvalue),不论a当时存储的是什么值。同时考虑到我们只是将b的数值赋给a,以后如果b的值改变了并不会影响到a的值.

例如:如果我们使用以下代码(变量值的变化显示在绿色注释部分):

// 赋值符号例子

#include <iostream>
using namespace std;

int main ()
{
  int a, b;         // a:?,  b:?
  a = 10;           // a:10, b:?
  b = 4;            // a:10, b:4
  a = b;            // a:4,  b:4
  b = 7;            // a:4,  b:7

  cout << "a:";
  cout << a;
  cout << " b:";
  cout << b;

  return 0;
}
a:4 b:7               

以上代码结果是a的值为4, b的值为7。最后一行中b的值被改变并不会影响到a,虽然在此之前我们声明了a = b; (从右到左规则right-to-left rule)。

C++拥有而其他语言没有的一个特性是赋值符 (=) 可以被用作另一个赋值符的rvalue (或rvalue的一部分) 。例如:

a = 2 + (b = 5);

等同于:

b = 5;
a = 2 + b;

它的意思是:先将5赋给变量b,然后把前面对b的赋值运算的结果(即5)加上2再赋给变量a,这样最后a中的值为7。因此,下面的表达式在C++中也是正确的:

a = b = c = 5; //将5同时赋给3个变量a, b和c。


数学运算符Arithmetic operators ( +, -, *, /, % )

C++语言支持的5种数学运算符为:

  • + 加addition
  • - 减subtraction
  • * 乘multiplication
  • / 除division
  • % 取模module

加减乘除运算想必大家都很了解,它们和一般的数学运算符没有区别。

唯一你可能不太熟悉的是用百分号(%)表示的取模运算(module)。取模运算是取两个整数相除的余数。例如,如果我们写a = 11 % 3;,变量a的值将会为结果2,因为2是11除以3的余数。


组合运算符Compound assignation operators (+=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |=)

C++以书写简练著称的一大特色就是这些组合运算符compound assignation operators (+=, -=, *= 和 /= 及其他) ,这些运算符使得只用一个基本运算符就可改写变量的值:

value += increase; 等同于 value = value + increase;

a -= 5; 等同于 a = a - 5;

a /= b; 等同于 a = a / b;

price *= units + 1; 等同于 price = price * (units + 1);

其他运算符以此类推。例如:

// 组合运算符例子

#include <iostream>
using namespace std;

int main ()
{
  int a, b=3;
  a = b;
  a+=2;             // 相当于 a=a+2
  cout << a;
  return 0;
}
5                  


递增和递减Increase and decrease

书写简练的另一个例子是递增(increase)运算符 (++)和递减(decrease) 运算符(--)。它们使得变量中存储的值加1或减1。它们分别等同于+=1和-=1。因此:

a++;
a+=1;
a=a+1; 

在功能上全部等同,即全部使得变量a的值加1。

它的存在是因为最早的C编译器将以上三种表达式的编译成不同的机器代码,不同的机器代码运行速度不一样。现在,编译器已经基本自动实行代码优化,所以以上三种不同的表达方式编译成的机器代码在实际运行上已基本相同。

这个运算符的一个特点是它既可以被用作prefix前缀,也可以被用作后缀suffix,也就是说它既可以被写在变量标识的前面(++a),也可以被写在后面(a++)。虽然在简单表达式如a++或++a中,这两种写法代表同样的意思,但当递增increase或递减decrease的运算结果被直接用在其它的运算式中时,它们就代表非常不同的意思了:当递增运算符被用作前缀prefix (++a) 时,变量a的值线增加,然后再计算整个表达式的值,因此增加后的值被用在了表达式的计算中;当它被用作后缀suffix (a++)时,变量a的值在表达式计算后才增加,因此a在增加前所存储的值被用在了表达式的计算中。注意以下两个例子的不同:

例 1例 2
B=3;
A=++B;
// A 的值为 4, B 
的值为 4
B=3;
A=B++;
// A 
的值为 3, B 的值为 4

在第一个例子中,B在它的值被赋给A之前增加1。而在第二个例子中B原来的值3被赋给 A然后B的值才加1变为4。


关系运算符Relational operators ( ==, !=, >, <, >=, <= )

我们用关系运算符来比较两个表达式。如ANSI-C++ 标准中指出的,关系预算的结果是一个bool值,根据运算结果的不同,它的值只能是真truefalse

例如我们想通过比较两个表达式来看它们是否相等或一个值是否比另一个的值大。以下为C++的关系运算符:

==相等Equal
!=不等Different
>大于Greater than
<小于Less than
>=大于等于Greater or equal than
<=小于等于Less or equal than

下面你可以看到一些实际的例子:

(7 == 5)将返回false.
(5 > 4)将返回true.
(3 != 2)将返回true.
(6 >= 6)将返回true.
(5 < 5)将返回false.

当然,除了使用数字常量,我们也可以使用任何有效表达式,包括变量。假设有a=2, b=3和c=6,

(a == 5)将返回false.
(a*b >= c)将返回true 因为它实际是(2*3 >= 6)
(b+4 > a*c)将返回false因为它实际是(3+4 > 2*6)
((b=2) == a)将返回true.

注意:运算符= (单个等号)不同于运算符== (双等号)。第一个是赋值运算符(将等号右边的表达式值赋给左边的变量);第二个(==)是一个判断等于的关系运算符,用来判断运算符两边的表达式是否相等。因此在上面例子中最后一个表达式((b=2) == a),我们首先将数值2赋给变量b,然后把它和变量a进行比较。因为变量a中存储的也是数值2,所以整个运算的结果为true。

在ANSI-C++标准出现之前的许多编译器中,就像C语言中,关系运算并不返回值为真true或假falsebool值,而是返回一个整型数值最为结果,它的数值可以为0,代表"false"或一个非0数值(通常为1)来代表"true"。

以上是关于C++基础知识—— 操作符/运算符的主要内容,如果未能解决你的问题,请参考以下文章

C++基础学习(05)——运算符

C++基础学习(05)——运算符

C++基础5 运算符重载提高

C++笔记--面向对象(OOP)编程基础--操作符重载及友元

C++基础入门丨3. 搞明白4类运算符——运算符

C++基础入门丨3. 搞明白4类运算符——运算符