目录
运算符
运算符也称操作符,是对数据进行运算的符号。
根据符号的个数,C++中可以把运算符分为单目运算符、双目运算符和三目运算符。
根据其功能,又可将运算符分为算术运算符、赋值运算符等等。
下面是常见的C++运算符和表达式的详解及示例:
算术运算符
加法运算符(+):将两个数相加。
int a = 10;
int b = 20;
int c = a + b; // c的值为30
减法运算符(-):将一个数减去另一个数。
int a = 10;
int b = 20;
int c = b - a; // c的值为10
乘法运算符(*):将两个数相乘。
int a = 10;
int b = 20;
int c = a * b; // c的值为200
除法运算符(/):将一个数除以另一个数。
int a = 20;
int b = 10;
int c = a / b; // c的值为2
取模运算符(%):将一个数除以另一个数,返回余数。
int a = 20;
int b = 10;
int c = a % b; // c的值为0
赋值运算符
赋值运算符(=):将右侧的值赋给左侧的变量。
int a = 10;
int b = 20;
b = a; // b的值变为10
加等于运算符(+=):将右侧的值加到左侧的变量上。
int a = 10;
int b = 20;
b += a; // b的值变为30
减等于运算符(-=):将右侧的值从左侧的变量中减去。
int a = 10;
int b = 20;
b -= a; // b的值变为10
乘等于运算符(*=):将左侧的变量乘以右侧的值。
int a = 10;
int b = 20;
b *= a; // b的值变为200
除等于运算符(/=):将左侧的变量除以右侧的值。
int a = 10;
int b = 20;
b /= a; // b的值变为2
取模等于运算符(%=):将左侧的变量取模右侧的值。
int a = 10;
int b = 20;
b %= a; // b的值变为0
比较运算符
等于运算符(==):判断两个值是否相等。
int a = 10;
int b = 20;
bool c = (a == b); // c的值为false
不等于运算符(!=):判断两个值是否不相等。
int a = 10;
int b = 20;
bool c = (a != b); // c的值为true
大于运算符(>):判断左侧的值是否大于右侧的值。
int a = 10;
int b = 20;
bool c = (b > a); // c的值为true
小于运算符(<):判断左侧的值是否小于右侧的值。
int a = 10;
int b = 20;
bool c = (a < b); // c的值为true
大于等于运算符(>=):判断左侧的值是否大于或等于右侧的值。
int a = 10;
int b = 20;
bool c = (b >= a); // c的值为true
小于等于运算符(<=):判断左侧的值是否小于或等于右侧的值。
int a = 10;
int b = 20;
bool c = (a <= b); // c的值为true
逻辑运算符
逻辑与运算符(&&):判断两个条件是否都为真。
int a = 10;
int b = 20;
bool c = (a > 5) && (b < 30); // c的值为true
逻辑或运算符(||):判断两个条件是否有一个为真。
int a = 10;
int b = 20;
bool c = (a > 5) || (b < 15); // c的值为true
逻辑非运算符(!):对条件取反。
int a = 10;
int b = 20;
bool c = !(a > b); // c的值为true
位运算符
按位与运算符(&):将两个数的二进制对应位相与,结果中每一位都是1时,结果为1,否则为0。
int a = 10; //二进制是1010
int b = 12; //二进制是1100
int c = a & b; // 每一位进行与运算,那么c的值为1000,也就是8
按位或运算符(|):对两个数的二进制进行按位或运算。
int a = 10; //二进制是1010
int b = 12; //二进制是1100
int c = a | b; // c的值为14(1110)
按位异或运算符(^):对两个数的二进制进行按位异或运算。
int a = 10; //二进制是1010
int b = 12; //二进制是1100
int c = a ^ b; // c的值为6(0110)
按位取反运算符(~):对一个数的二进制进行按位取反运算。
int a = 10; //二进制是1010
int b = ~a; // b的值为-11
取反运算符公式:n=-(n+1) 计算机中二进制以补码的形式存在。
左移运算符(<<):将一个数的二进制表示向左移动若干位,右侧用0填充,左侧超出的位数被舍弃,相当于将该数乘以2的n次方。
int a = 10; //二进制是1010
int b = a << 2; // b的值为40
右移运算符(>>):将一个数的二进制表示向右移动若干位,左侧用符号位填充,右侧超出的位数被舍弃,相当于将该数除以2的n次方。
int a = 10;
int b = a >> 2; // b的值为2
自增自减运算符
C++中的自增自减运算符分为前缀和后缀两种形式。前缀形式先对变量进行自增或自减操作,然后将结果作为表达式的值;后缀形式先将变量的值作为表达式的值,再对变量进行自增或自减操作。两种形式的区别在于它们返回的值不同。
示例代码如下:
int a = 5;
int b = ++a; // 前缀自增,a先自增1,然后将结果6赋值给b
int c = a++; // 后缀自增,a的值5赋值给c,然后a自增1
int d = --a; // 前缀自减,a先自减1,然后将结果5赋值给d
int e = a--; // 后缀自减,a的值5赋值给e,然后a自减1
记住先出现先处理
需要注意的是,在表达式中多次使用自增自减运算符时,要根据它们的优先级和结合性来计算。例如,表达式i = j++ + ++k;的计算顺序是先计算++k,然后计算j++,最后计算+运算符。这个表达式等价于i = j + k + 1;。
其他运算符
条件运算符(?:),唯一的三目运算符:根据一个条件的真假值来决定返回两个值中的一个。
int a = 10;
int b = 20;
int c = (a > b) ? a : b; // c的值为20
逗号运算符(,):按顺序执行多个表达式,并返回最后一个表达式的值。
int a = 10,
b = 20,
c = 30;
int d = (a++, b++, c++); // d的值为30,a、b、c分别为11、21、31
sizeof运算符:返回一个数据类型或变量所占的字节数。
int a = 10;
int b = sizeof(a); // b的值为4,因为int类型占用4个字节
注意不要对指针使用 sizeof
使用它们可以进行各种数学运算、逻辑判断和位操作。
优先级
C++中的运算符有不同的优先级,优先级高的运算符先执行,优先级低的运算符后执行。如果表达式中存在多个操作符,需要根据优先级规则来决定它们的计算顺序。以下是C++中常见操作符的优先级从高到低的排列:
优先级 | 运算符 | 描述 |
1 | :: | 作用域解析 |
2 | ()、[]、->、. | 函数调用、数组下标、成员访问、指向成员访问 |
3 | ++、-- | 自增、自减 |
4 | !、~、+、- | 逻辑非、按位取反、一元加、一元减 |
5 | *、/、% | 乘法、除法、取模 |
6 | +、- | 加法、减法 |
7 | <<、>> | 左移、右移 |
8 | <、<=、>、>= | 关系运算符 |
9 | ==、!= | 相等性运算符 |
10 | & | 按位与 |
11 | ^ | 按位异或 |
12 | | | 按位或 |
13 | && | 逻辑与 |
14 | || | 逻辑或 |
15 | ?: | 条件运算符 |
16 | =、+=、-=、*=、/=、%= | 赋值运算符 |
17 | , | 逗号运算符 |
需要注意的是,优先级高的运算符不一定就是计算结果的优先级高,因为括号的使用可以改变操作符的优先级。因此,在编写表达式时,应当注意使用括号来明确运算符的优先级。例如:
int x = 2, y = 3, z = 4;
int a = x + y * z; // 结果为14,优先级高的*先计算
int b = (x + y) * z; // 结果为20,使用括号改变优先级
表达式
在C++中,表达式是由一系列的运算符和操作数组成的式子,可以用于计算一个值或执行某个操作。
表达式的组成部分包括:
操作数(Operand):表达式中参与运算的值,可以是变量、常量、函数调用等。
运算符(Operator):用于进行运算或操作的符号,包括算术运算符、关系运算符、逻辑运算符、赋值运算符等。
分隔符:用于分隔表达式中的不同部分的符号,例如括号、逗号等。
表达式可以包含单个操作数,也可以由多个操作数和运算符组成。例如,以下是几个简单的表达式:
2 + 3 // 算术表达式,计算2和3的和
x * y // 算术表达式,计算变量x和y的乘积
x > y // 关系表达式,判断变量x是否大于变量y,返回一个布尔值
a && b // 逻辑表达式,判断变量a和b是否都为真,返回一个布尔值
表达式的值的类型和结果的类型由表达式中参与运算的操作数和运算符决定。表达式的值可以用于赋值给变量或传递给函数等。
需要注意的是,表达式的计算顺序和优先级由运算符的优先级和括号的使用决定。在编写表达式时,应当注意运算符的优先级,避免出现不符合预期的计算结果。