C++青少年简明教程:运算符
C++ 中的运算符是用于执行操作的符号,用于执行各种数据类型上的运算。运算符可以分为几大类:算术运算符、比较运算符(关系运算符)、逻辑运算符、位运算符、赋值运算符和其他特殊运算符。
★赋值运算符:用于将值分配给变量,将右侧的值赋给左侧的变量。C++的赋值运算符:
= (赋值) 例如:int num = 10; // 将10赋值给num
+= (加赋值)
-= (减赋值)
*= (乘赋值)
/= (除赋值)
%= (取余赋值)
等
★算术运算符:用于执行基本数学运算,如加法、减法、乘法和除法等。
☆加法运算符:x + y
☆减法运算符:x - y
☆乘法运算符:x * y
☆除法运算符:x / y。C++中,x / y需要注意数据类型,具体来说,如果两个操作数都是整数类型(如int、long等),则在进行除法运算时,C++会将结果截断为整数部分,舍弃小数部分。例如:
int x = 7;
int y = 2;
int result = x / y; // 结果为3,舍弃了小数部分
如果其中一个操作数是浮点数类型(float、double),那么 C++ 将执行浮点除法,结果将是一个浮点数。
☆取余运算符: % 如: 7 % 3
的结果为 1,因为 7 除以 3 的余数是 1
☆自增/自减运算符: ++ 和 --
例如:
自增/自减运算符 ++ 和 -- 可以使变量的值增加或减少 1。++ 使变量的值增加,-- 使变量的值减少。这两个运算符可以出现在变量前面和后面,分别称为前缀和后缀形式。前缀形式(如++i、--i)表示先进行自增/自减运算,然后再使用变量的值。后缀形式(如i++、i--)表示先使用变量的值,然后再进行自增/自减运算。下面是一个例子:
#include <iostream>
using namespace std;
int main() {
int i=0;
cout << ++i << endl; // 输出1。先将i增加到1,然后再输出它的值。
int j=0;
cout << j++ << endl; // 输出0。先输出j的当前值0,然后再将j增加到1。
}
☆复合运算符
C++ 算术运算符包括复合运算符。复合运算符是一种结合了算术运算符和赋值运算符的运算符。它们执行算术运算并将结果存储回一个变量中。一些常用的复合运算符及其作用:
+=:将右操作数与左操作数相加,并将结果赋值给左操作数。例如,x += y 相当于 x = x + y。
-=:将右操作数从左操作数中减去,并将结果赋值给左操作数。例如,x -= y 相当于 x = x - y。
*=:将右操作数与左操作数相乘,并将结果赋值给左操作数。例如,x *= y 相当于 x = x * y。
/=:将左操作数除以右操作数,并将结果赋值给左操作数。例如,x /= y 相当于 x = x / y。
%=:将左操作数除以右操作数的余数赋值给左操作数。例如,x %= y 相当于 x = x % y。
★逻辑运算符:用于执行逻辑运算。
☆与(AND)运算符&&,表示“且”的关系:x && y //当x和y都为真时,结果为真。
☆或(OR)运算符||,表示“或”的关系:x || y //当x和y有一个为真时,结果为真。
☆非(NOT)运算符!它表示取反:!x
提示:在C++中,true和false是预定义的值,其对应的整数值是1和0,分别表示真和假。
例子:
int num1 = 5;
int num2 = 3;
bool isTrue1 = (num1 > 0 && num2 < 10); // 结果为true即1
bool isTrue2 = (num1 > 0 || num2 < 1); // 结果为true即1
bool isTrue3 =! (num2 < 1); // 结果为true即1
★关系运算符(比较运算符):用于比较两个值之间的关系。
例如:
☆等于运算符:x == y
☆不等于运算符:x != y
☆大于运算符:x > y
☆小于运算符:x < y
☆大于等于运算符:x >= y
☆小于等于运算符:x <= y
★位运算符(初学者暂不学,等到学习二进制一节后再回头看吧)
在 C++ 中,位运算符用于对整数对应的二进制数的位进行操作。二进制逻辑运算符只能对整数类型进行操作,不能用于浮点数。
按位与(&):对两个操作数的每个对应位执行逻辑与操作,只有当两个位都为1时,结果才为1。
按位或(|):对两个操作数的每个对应位执行逻辑或操作,只要有一个位为1,结果就为1。
按位异或(^):对两个操作数的每个对应位执行逻辑异或操作,当两个位不同时,结果为1。
按位取反(~):对操作数的每个位取反,即0变为1,1变为0。
左移(<<):将操作数的所有位向左移动指定的位数,右侧的空位用0填充。
右移(>>):将操作数的所有位向右移动指定的位数,左侧的空位用0或者符号位填充(取决于是无符号还是有符号数据类型)。
例子:
#include <iostream>
using namespace std;
int main() {
int a = 5; // 二进制表示为 0101
int b = 3; // 二进制表示为 0011
int result = a & b; // 二进制按位与操作:0001,结果是1
cout << "Bitwise AND: " << result << endl;
result = a | b; // 二进制按位或操作:0111,结果是7
cout << "Bitwise OR: " << result << endl;
result = a ^ b; // 二进制按位异或操作:0110,结果是6
cout << "Bitwise XOR: " << result << endl;
result = ~a; // 二进制按位取反操作:1010,结果是-6(补码表示)
cout << "Bitwise NOT: " << result << endl;
result = a << 2; // 左移两位:010100,结果是20
cout << "Left shift: " << result << endl;
result = b >> 1; // 右移一位:0001,结果是1
cout << "Right shift: " << result << endl;
return 0;
}
C++ 运算符优先级和结合性
运算符优先级:运算符优先级规定了在没有显式括号的情况下,哪一个运算符会先被求值。例如,乘法运算符(*)的优先级高于加法运算符(+),所以在表达式3 + 4 * 5中,乘法会先执行。常见运算符优先级:赋值运算符 < 逻辑运算符 < 关系运算符 < 算术运算符
结合性:结合性规定了当多个运算符具有相同优先级时,运算的执行方向。运算符可以是左结合的(left-associative)或右结合的(right-associative)。
运算符优先级
例如
int result = 3 + 4 * 5;
在这个表达式中,乘法运算符(*)的优先级高于加法运算符(+),因此,乘法会首先执行:
4 * 5 = 20
然后再进行加法运算:
3 + 20 = 23
所以,result的值是23。
结合性
例如:
int result = 5 - 3 - 1;
减法运算符(-)是左结合的,这意味着从左到右依次进行计算:
首先计算第一个减法:
5 - 3 = 2
然后计算第二个减法:
2 - 1 = 1
所以,result的值是1。
赋值运算符(=)是右结合的。例如:
int a, b, c;
a = b = c = 10;
赋值运算符是右结合的,因此从右到左依次进行计算:
首先,c = 10,所以c的值是10。
然后,b = c,因为c的值是10,所以b的值也是10。
最后,a = b,因为b的值是10,所以a的值也是10。
使用括号可以明确地指定表达式的求值顺序,并覆盖默认的运算符优先级和结合性。当对运算符优先级和结合性不清楚时,使用括号是一个非常好的做法。括号可以明确指定计算顺序,从而避免因运算符优先级和结合性引起的歧义和错误。
例如:
int a, b, c;
a = b = c = 10;
可以改写为:
为了确保理解正确,可以添加括号(虽然在这个例子中不需要):
int a, b, c;
a = (b = (c = 10));
这明确表示赋值顺序是从右向左。
下表将按运算符优先级从高到低列出各个运算符,表中靠前的优先级高于后面的。在表达式中,较高优先级的运算符会优先被计算。
类别 | 运算符 | 结合性 |
后缀 | () [] -> . ++ - - | 从左到右 |
一元 | + - ! ~ ++ - - (type)* & sizeof | 从右到左 |
乘除 | * / % | 从左到右 |
加减 | + - | 从左到右 |
移位 | << >> | 从左到右 |
关系 | < <= > >= | 从左到右 |
相等 | == != | 从左到右 |
位与 AND | & | 从左到右 |
位异或 XOR | ^ | 从左到右 |
位或 OR | | | 从左到右 |
逻辑与 AND | && | 从左到右 |
逻辑或 OR | || | 从左到右 |
条件 | ?: | 从右到左 |
赋值 | = += -= *= /= %=>>= <<= &= ^= |= | 从右到左 |
逗号 | , | 从左到右 |
【附:详见 C++ Operator Precedence - C++ - API Reference Document
C++ 运算符优先级 - C++中文 - API参考文档 】
运算符总括
C++中常用的运算符及其描述如下:
- 算术运算符:+、-、*、/、%(取模)
- 比较运算符:==、!=、>、<、>=、<=
- 逻辑运算符:&&(逻辑与)、||(逻辑或)、!(逻辑非)
- 位运算符:&(按位与)、|(按位或)、^(按位异或)、~(按位取反)、<<(左移)、>>(右移)
- 赋值运算符:=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=
这些运算符的优先级和结合性如下:
- 一元运算符(如取地址符&和解引用符*)的优先级高于二元运算符,但是结合性是从右向左的。
- 算术运算符的优先级从高到低为:一元加/减、乘法/除法/求余、加法/减法。结合性都是从左向右的。
- 比较运算符的优先级相同,高于逻辑运算符,结合性是从左向右的。
- 逻辑运算符的优先级从高到低为:非、与、或。结合性都是从左向右的。
- 位运算符的优先级从高到低为:按位取反、左移/右移、按位与、按位异或、按位或。结合性都是从左向右的。
- 赋值运算符的优先级从高到低为:复合赋值运算符(如+=、-=等),等于号=。结合性是从右向左的。
注意:C++ 中的一些符号可能具有不同的含义,具体取决于上下文。例如:
% 运算符在数学运算中表示取模(取余数),而在字符串格式化中表示格式化的占位符。
<< 运算符在输出流中用于将数据插入到流中,例如,std::cout << "Hello, world!";位左移运算符,在二进制运算中,<< 运算符会将一个数的二进制位向左移动若干位,相当于将这个数乘以2的左移位数次方。例如,a << n 表示将整数 a 向左移动 n 位,左移后高位补零,低位舍弃。例如,整数 9 的二进制表示为 1001,执行 9 << 1 后,它的二进制表示变为 10010,十进制表示为 18。