数学运算符和优先级
运算符的概念
在数学里我们会用加、减、乘、除这些符号来进行计算,在编程里也有类似的符号,叫做运算符。运算符可以对数据进行各种操作,就像我们用工具来完成不同的事情一样。本文我们来学习 C++ 里常用的单目、双目运算符。
单目运算符
单目运算符只需要一个操作数,就好像一个人就能完成的事情。
负号运算符(-)
这个运算符可以把一个数变成它的相反数。比如原来是正数,用了负号运算符就变成负数;原来是负数,就变成正数。
#include <iostream>
using namespace std;
int main() {
int num = 5; // 定义一个整数变量 num,初始值为 5
int result = -num; // 使用负号运算符,把 num 变成它的相反数
cout << "5 的相反数是:" << result << endl; // 输出结果
return 0;
}在这个例子中,num 的值是 5,使用负号运算符后,result 的值就变成了 -5。
自增运算符(++)
自增运算符可以让变量的值增加 1。它有两种形式:前置自增(++变量名)和后置自增(变量名++)。前置自增是先把变量的值加 1,再使用变量的值;后置自增是先使用变量的值,再把变量的值加 1。
#include <iostream>
using namespace std;
int main() {
int a = 5; // 定义一个整数变量 a,初始值为 5
int b = ++a; // 前置自增,先把 a 的值加 1,再把 a 的值赋给 b
cout << "前置自增后,a 的值是:" << a << ", b 的值是:" << b << endl;
int c = 5; // 重新定义一个整数变量 c,初始值为 5
int d = c++; // 后置自增,先把 c 的值赋给 d,再把 c 的值加 1
cout << "后置自增后,c 的值是:" << c << ", d 的值是:" << d << endl;
return 0;
}在这个例子中,前置自增后,a 的值变成了 6,b 的值也是 6;后置自增后,c 的值变成了 6,但 d 的值是 5。
自减运算符(--)
自减运算符可以让变量的值减少 1。它也有前置自减(--变量名)和后置自减(变量名--)两种形式,用法和自增运算符类似。
#include <iostream>
using namespace std;
int main() {
int a = 5; // 定义一个整数变量 a,初始值为 5
int b = --a; // 前置自减,先把 a 的值减 1,再把 a 的值赋给 b
cout << "前置自减后,a 的值是:" << a << ", b 的值是:" << b << endl;
int c = 5; // 重新定义一个整数变量 c,初始值为 5
int d = c--; // 后置自减,先把 c 的值赋给 d,再把 c 的值减 1
cout << "后置自减后,c 的值是:" << c << ", d 的值是:" << d << endl;
return 0;
}在这个例子中,前置自减后,a 的值变成了 4,b 的值也是 4;后置自减后,c 的值变成了 4,但 d 的值是 5。
双目运算符
双目运算符需要两个操作数,就好像需要两个人一起完成的事情。
加法运算符(+)
加法运算符可以把两个数相加。
#include <iostream>
using namespace std;
int main() {
int a = 3; // 定义一个整数变量 a,初始值为 3
int b = 5; // 定义一个整数变量 b,初始值为 5
int result = a + b; // 使用加法运算符,把 a 和 b 相加
cout << "3 + 5 的结果是:" << result << endl; // 输出结果
return 0;
}在这个例子中,a 的值是 3,b 的值是 5,使用加法运算符后,result 的值是 8。
减法运算符(-)
减法运算符可以用一个数减去另一个数。
#include <iostream>
using namespace std;
int main() {
int a = 8; // 定义一个整数变量 a,初始值为 8
int b = 3; // 定义一个整数变量 b,初始值为 3
int result = a - b; // 使用减法运算符,用 a 减去 b
cout << "8 - 3 的结果是:" << result << endl; // 输出结果
return 0;
}在这个例子中,a 的值是 8,b 的值是 3,使用减法运算符后,result 的值是 5。
乘法运算符(*)
乘法运算符可以把两个数相乘。
#include <iostream>
using namespace std;
int main() {
int a = 4; // 定义一个整数变量 a,初始值为 4
int b = 6; // 定义一个整数变量 b,初始值为 6
int result = a * b; // 使用乘法运算符,把 a 和 b 相乘
cout << "4 * 6 的结果是:" << result << endl; // 输出结果
return 0;
}在这个例子中,a 的值是 4,b 的值是 6,使用乘法运算符后,result 的值是 24。
除法运算符(/)
除法运算符可以用一个数除以另一个数。要注意,如果两个操作数都是整数,结果会只保留整数部分。
#include <iostream>
using namespace std;
int main() {
int a = 10; // 定义一个整数变量 a,初始值为 10
int b = 3; // 定义一个整数变量 b,初始值为 3
int result = a / b; // 使用除法运算符,用 a 除以 b
cout << "10 / 3 的结果是:" << result << endl; // 输出结果
return 0;
}在这个例子中,a 的值是 10,b 的值是 3,使用除法运算符后,result 的值是 3,因为只保留了整数部分。
取模运算符(%)
取模运算符可以得到两个数相除的余数。
#include <iostream>
using namespace std;
int main() {
int a = 10; // 定义一个整数变量 a,初始值为 10
int b = 3; // 定义一个整数变量 b,初始值为 3
int result = a % b; // 使用取模运算符,得到 a 除以 b 的余数
cout << "10 % 3 的结果是:" << result << endl; // 输出结果
return 0;
}在这个例子中,a 的值是 10,b 的值是 3,使用取模运算符后,result 的值是 1,因为 10 除以 3 的余数是 1。
运算符的优先级
以下是 C++ 中相关运算符的优先级表,按从高到低排列:
| 优先级 | 运算符 | 名称/描述 | 结合性 |
|---|---|---|---|
| 1 | ++(后置)、--(后置) | 后置自增/自减 | 从左到右 |
| 2 | ++(前置)、--(前置)、+(正号)、-(负号) | 前置自增/自减、单目运算符 | 从右到左 |
| 3 | *、/、% | 乘法、除法、取模 | 从左到右 |
| 4 | +(加法)、-(减法) | 双目加法、减法 | 从左到右 |
详细说明:
-
后置自增/自减 (
a++,a--)
优先级最高,先返回当前值,再对操作数进行自增/自减。int a = 5; int b = a++ * 2; // b = 5*2=10,然后 a=6 -
前置自增/自减 (
++a,--a) 和单目运算符 (+a,-a)
先对操作数进行自增/自减或符号运算,再返回结果。int a = 5; int b = ++a * 2; // a=6,b=6*2=12 int c = -a; // c = -6 -
乘法、除法、取模 (
*,/,%)
从左到右结合,先计算乘除/取模,再处理加减。int a = 5 + 3 * 2; // 3*2=6,5+6=11 -
双目加法、减法 (
+,-)
最低优先级,从左到右结合。int a = 10 - 3 + 2; // (10-3)=7, 7+2=9
示例验证:
int a = 5;
int b = -a++ * 3 + 2;
// 等效于:(-(a++)) * 3 + 2 → (-5)*3 + 2 = -15 + 2 = -13(a 最终为 6)int a = 5;
int b = ++a * -a;
// 等效于:(++a) * (-a) → a 先自增到 6,然后 6 * (-6) = -36