运算符
一旦引入变量和常量,我们就可以开始使用运算符来操作它们。以下是完整的运算符列表。此时,可能没有必要知道所有这些,但它们都列在这里也作为参考。
赋值运算符(=)
赋值运算符为变量赋值。
x = 5;
此语句将整数值分配5给变量x。赋值操作总是从右到左进行,而从不反过来:
x = y;
此语句将变量x中包含的值赋给变量y。值x执行目前这一声明是丢失,由价值所取代y。
还要考虑我们仅在赋值操作时分配y的值给x。因此,如果y稍后更改,则不会影响所采用的新值x。
例如,让我们看看下面的代码 - 我已经将变量中存储的内容的演变作为注释:
// assignment operator
#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;
}
a:4 b:7
编辑并运行
该程序在屏幕上打印最终值a和b(分别为4和7)。请注意,尽管我们之前已经声明,但a最终修改并未受到影响。 赋值操作是可以计算的表达式。这意味着赋值本身具有一个值,对于基本类型 - 该值是在操作中指定的值。例如:ba = b
y = 2 + (x = 5);
在此表达式中,y将分配添加2的结果和另一个赋值表达式的值(其值本身为5)。它大致相当于:
x = 5;
y = 2 + x;
最后的结果是分配7 y。
以下表达式在C ++中也有效:
x = y = z = 5;
它分配5到三个变量:x,y和z; 总是从右到左。
算术运算符(+, - ,*,/,%)
C ++支持的五个算术运算是:
运算符 描述
- 加法
- 减法
- 乘法
/ 除法
% 模
加法,减法,乘法和除法的运算字面上对应于它们各自的数学运算符。最后一个,模数运算符,由百分号(%)表示,给出两个值的除法的余数。例如:
x = 11 % 3;
导致变量x包含值2,因为将11除以3得到3,余数为2。
复合赋值(+ =, - =,* =,/ =,%=,>> =,<< =,&=,^ =,| =)
复合赋值运算符通过对变量执行操作来修改变量的当前值。它们相当于将操作的结果分配给第一个操作数:
表达 相当于…
y += x; y = y + x;
x -= 5; x = x - 5;
x /= y; x = x / y;
price *= units + 1; price = price * (units+1);
对于所有其他复合赋值运算符也是如此。例如:
// compound assignment operators
#include <iostream>
using namespace std;
int main ()
{
int a, b=3;
a = b;
a+=2; // equivalent to a=a+2
cout << a;
}
递增和递减(++, - )
某些表达式可以进一步缩短:增加operator(++)和减少运算符(–)将变量中存储的值增加或减少一。它们分别相当于+=1和-=1。从而:
++x;
x+=1;
x=x+1;
在功能上都是等价的; 他们三个增加了一个值x。
在早期的C编译器中,前三个表达式可能产生了不同的可执行代码,具体取决于使用的是哪一个。如今,这种类型的代码优化通常由编译器自动执行,因此三个表达式应该产生完全相同的可执行代码。
该运算符的一个特点是它既可以用作前缀,也可以用作后缀。这意味着它可以在变量name(++x)之前或之后(x++)之后写入。虽然用简单的表达式,如x++或++x,两者都有完全相同的含义; 在评估递增或递减操作的结果的其他表达式中,它们的含义可能有重要区别:在将增量运算符用作++x值的前缀()的情况下,表达式求值为最终值x一旦它已经增加,它的价值。另一方面,如果将其用作后缀(x++),则该值也会增加,但表达式的计算结果为x在增加之前的值。注意区别:
例1 例2
x = 3;
y = ++x;
// x contains 4, y contains 4
x = 3;
y = x++;
// x contains 4, y contains 3
在示例1中,分配y的值x是增加后的值。而在实施例2中,它是在x增加之前的值。
关系和比较运算符(==,!=,>,<,> =,<=)
可以使用关系运算符和相等运算符来比较两个表达式。例如,要知道两个值是否相等,或者一个值是否大于另一个。
这种操作的结果是真或假(即布尔值)。
C ++中的关系运算符是:
操作者 描述
== 等于
!= 不等于
< 少于
> 比...更棒
<= 小于或等于
>= 大于或等于
这里有一些例子:
(7 == 5) // evaluates to false
(5 > 4) // evaluates to true
(3 != 2) // evaluates to true
(6 >= 6) // evaluates to true
(5 < 5) // evaluates to false
当然,它不仅仅是可以比较的数字常量,而是任何值,当然还包括变量。假设a=2,b=3和c=6,则:
(a == 5) // evaluates to false, since a is not equal to 5
(a*b >= c) // evaluates to true, since (2*3 >= 6) is true
(b+4 > a*c) // evaluates to false, since (3+4 > 2*6) is false
((b=2) == a) // evaluates to true
小心!赋值运算符(运算符=,带一个等号)与等式比较运算符(运算符==,两个等号)不同; 第一个(=)将右侧的值分配给左侧的变量,而另一个(==)则比较运算符两侧的值是否相等。因此,在最后一个表达式((b=2) == a),我们首先分配值2给b,然后,我们比较它a(即还存储值2),得到true。
逻辑运算符(!,&&,||)
运算符!是布尔运算NOT的C ++运算符。它右边只有一个操作数,并将其反转,false如果它的操作数是true,true则产生,如果它的操作数是false。基本上,它返回评估其操作数的相反布尔值。例如:
!(5 == 5) // evaluates to false because the expression at its right (5 == 5) is true
!(6 <= 4) // evaluates to true because (6 <= 4) would be false
!true // evaluates to false
!false // evaluates to true
逻辑运算符&&和||正在评估两个表达式时用于获得单个关系的结果。运算符&&对应于布尔逻辑运算AND,true如果两者的操作数都是true,false则产生AND,否则。以下面板显示运算符&&评估表达式的结果a&&b:
&&运营商(和)
a b a && b
true true true
true false false
false true false
false false false
运算符||对应于布尔逻辑运算OR,true如果true两个操作数都是假的,则产生它的任一个,因此只有当两个操作数都为假时才为假。以下是可能的结果a||b:
|| 操作员(或)
a b a || b
true true true
true false true
false true true
false false false
例如:
1
2
( (5 == 5) && (3 > 6) ) // evaluates to false ( true && false )
( (5 == 5) || (3 > 6) ) // evaluates to true ( true || false )
当使用逻辑运算符时,C ++仅评估从左到右所需的内容以得出组合的关系结果,忽略其余的结果。因此,在最后一个例子中((55)||(3>6)),C ++评估第一是否55是true,如果是这样,它永远不会检查是否3>6是true或不是。这被称为短路评估,对于这些运营商来说就像这样:
操作者 短路
&& 如果左侧表达式是false,则组合结果是false(从不评估右侧表达式)。
|| 如果左侧表达式是true,则组合结果是true(从不评估右侧表达式)。
当右侧表达式具有副作用(例如更改值)时,这一点非常重要:
if ( (i<10) && (++i<n) ) { /…/ } // note that the condition increments i
这里,组合的条件表达式将增加i1,但仅当左边的条件&&是true,否则,++i<n从不评估右侧()的条件。
条件三元运算符(?)
条件运算符计算表达式,返回如果表达式计算为一个值true,并且如果该表达式评估为不同的一个false。它的语法是:
condition ? result1 : result2
如果condition是true,则整个表达式的计算结果为result1,否则为result2。
75 ? 4 : 3 // evaluates to 3, since 7 is not equal to 5.
75+2 ? 4 : 3 // evaluates to 4, since 7 is equal to 5+2.
5>3 ? a : b // evaluates to the value of a, since 5 is greater than 3.
a>b ? a : b // evaluates to whichever is greater, a or b.
例如:
// conditional operator
#include <iostream>
using namespace std;
int main ()
{
int a,b,c;
a=2;
b=7;
c = (a>b) ? a : b;
cout << c << '\n';
}
在这个例子中,a是2,并且b是7,所以被评估的表达式(a>b)不是true,因此在问号被丢弃之后指定的第一个值有利于第二个值(冒号后面的那个)b(有一个价值7)。
逗号运算符(,)
逗号运算符(,)用于分隔两个或多个表达式,这些表达式只包含一个表达式。当必须为某个值计算表达式集时,只考虑最右侧的表达式。
例如,以下代码:
a = (b=3, b+2);
首先将值3分配给b,然后分配b+2给变量a。因此,最后,变量a将包含值5,而变量b将包含值3。
按位运算符(&,|,^,〜,<<,>>)
位运算符考虑表示它们存储的值的位模式来修改变量。
操作者 asm等价物 描述
& AND 按位AND
| OR 按位包含OR
^ XOR 按位异或
~ NOT 一元补码(位反转)
<< SHL 转移位左
>> SHR 移位正确
显式类型转换运算符
类型转换运算符允许将给定类型的值转换为另一种类型。在C ++中有几种方法可以做到这一点。从C语言继承的最简单的一个是在括号(())之间的新类型转换表达式之前:
int i;
float f = 3.14;
i = (int) f;
前面的代码将浮点数转换为3.14整数值(3); 其余的都丢了。这里,类型转换运算符是(int)。在C ++中执行相同操作的另一种方法是使用表达式之前的函数表示法按类型转换并将表达式括在括号中:
i = int (f);
两种类型的转换类型在C ++中都是有效的。
的sizeof
此运算符接受一个参数,该参数可以是类型或变量,并返回该类型或对象的字节大小:
x = sizeof (char);
这里,x赋值1,因为char是一个大小为一个字节的类型。
返回的值sizeof是编译时常量,因此始终在程序执行之前确定。
其他运营商
稍后在这些教程中,我们将看到更多的运算符,比如引用指针或面向对象编程的细节。
运营商的优先权
单个表达式可能有多个运算符。例如:
x = 5 + 7 % 2;
在C ++中,上面的表达式总是将6分配给变量x,因为%运算符的优先级高于+运算符,并且始终在之前进行求值。表达式的一部分可以括在括号中以覆盖此优先顺序,或明确说明预期的效果。注意区别:
x = 5 + (7 % 2); // x = 6 (same as without parenthesis)
x = (5 + 7) % 2; // x = 0
从最高优先级到最小优先级,C ++运算符按以下顺序进行评估:
水平 优先组 操作者 描述 分组
1 范围 :: 范围限定符 左到右
2 后缀(一元) ++ -- 后缀增量/减量 左到右
() 功能形式
[] 标
. -> 会员访问
3 前缀(一元) ++ -- 前缀增量/减量 右到左
~ ! 按位NOT /逻辑NOT
+ - 一元前缀
& * 参考/解除引用
new delete 分配/解除分配
sizeof 参数包
(type) C型铸造
4 指针到成员 .* ->* 访问指针 左到右
五 算术:缩放 * / % 乘,除,模 左到右
6 算术:加法 + - 另外,减法 左到右
7 按位移位 << >> 左转,右转 左到右
8 相关的 < > <= >= 比较运算符 左到右
9 平等 == != 平等/不平等 左到右
10 和 & 按位AND 左到右
11 独家或 ^ 按位异或 左到右
12 包容性或 | 按位OR 左到右
13 连词 && 逻辑AND 左到右
14 析取 || 逻辑或 左到右
15 作业级表达式 = *= /= %= += -=
>>= <<= &= ^= |= 赋值/复合赋值 右到左
?: 条件运算符
16 测序 , 逗号分隔符 左到右
当表达式具有两个具有相同优先级的运算符时,分组将确定首先评估哪个运算符:从左到右或从右到左。
将所有子语句括在括号中(即使那些因为它们的优先级而不必要)也可以提高代码的可读性。