LogoCSP Wiki By Yundou
基础知识

数学运算符和优先级

运算符的概念

在数学里我们会用加、减、乘、除这些符号来进行计算,在编程里也有类似的符号,叫做运算符。运算符可以对数据进行各种操作,就像我们用工具来完成不同的事情一样。本文我们来学习 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 的值变成了 6b 的值也是 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 的值变成了 4b 的值也是 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 的值是 3b 的值是 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 的值是 8b 的值是 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 的值是 4b 的值是 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 的值是 10b 的值是 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 的值是 10b 的值是 3,使用取模运算符后,result 的值是 1,因为 10 除以 3 的余数是 1

运算符的优先级

以下是 C++ 中相关运算符的优先级表,按从高到低排列:

优先级运算符名称/描述结合性
1++(后置)、--(后置)后置自增/自减从左到右
2++(前置)、--(前置)、+(正号)、-(负号)前置自增/自减、单目运算符从右到左
3*/%乘法、除法、取模从左到右
4+(加法)、-(减法)双目加法、减法从左到右

详细说明:

  1. 后置自增/自减 (a++, a--)
    优先级最高,先返回当前值,再对操作数进行自增/自减。

    int a = 5;
    int b = a++ * 2;  // b = 5*2=10,然后 a=6
  2. 前置自增/自减 (++a, --a) 和单目运算符 (+a, -a)
    先对操作数进行自增/自减或符号运算,再返回结果。

    int a = 5;
    int b = ++a * 2;  // a=6,b=6*2=12
    int c = -a;       // c = -6
  3. 乘法、除法、取模 (*, /, %)
    从左到右结合,先计算乘除/取模,再处理加减。

    int a = 5 + 3 * 2;  // 3*2=6,5+6=11
  4. 双目加法、减法 (+, -)
    最低优先级,从左到右结合。

    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

例题