“常量、变量、函数调用” 和 “用运算符把它们或表达式连接在一起” 的语句是表达式。表达式可以有返回值,也可以没有返回值。表达式还能修改一些变量的值。C++ 的运算符能分为以下几类(按优先级从达到小排序):
| 类型 | 英语 | 运算符 | 结合性 |
|---|---|---|---|
| 后缀 | Postfix | . () [] -> ++ -- |
-> |
| 单目 | Unary | + - ! ~ * & ++ -- sizeof |
<- |
| 乘性 | Multiplicative | * / % |
-> |
| 加性 | Additive | + - |
-> |
| 移位 | Shift | << >> |
-> |
| 关系 | Relational | < > <= >= |
-> |
| 相等 | Eauality | == != |
-> |
| 位与 | Bitwise AND | & |
-> |
| 位异或 | Bitwise XOR | ^ |
-> |
| 位或 | Bitwise OR | | |
-> |
| 逻辑与 | Logical AND | && and |
-> |
| 逻辑或 | Logical OR | || or |
-> |
| 条件 | Conditional | ?: |
<- |
| 赋值 | Assignment | = += -= *= /= %= <<= >>= &= ^= |= |
<- |
| 逗号 | Comma | , |
-> |
计算机是用二进制处理数字的。在上面的表格中,~、“位与 / 或 / 异或运算符” 和 “赋值运算符” 的后面 5 个是一种能对变量的二进制比特位进行操作的运算符。这些运算被称为位运算。因为考虑到位运算的速度快(?),所以位运算在信息学比赛代码中很常用。
结合性 用于判断一条表达式中同级运算符的优先级。结合性是 -> 意味着左边的运算符优先级比右边的更高,反之亦然。
改变表达式的运算顺序可以使用小括号()(遇到嵌套时直接用小括号就行了,[] 和 {} 有其它的含义)。
加减乘其实我们都很熟悉了,这里重点说 /(整数除法)和 %(取模运算)。到目前为止,我们学习的都是对整型变量的运算。
在 C/C++ 中,整数除法和取模运算,与数学上习惯的取模和除法不一致。
对于所有标准版本的 C/C++,规定在整数除法中:
- 当除数为 0 时,行为未定义;
- 否则
(a / b) * b + a % b的运算结果与a相等。 也就是说,取模运算的符号取决于除法如何取整;而除法如何取整,这是实现定义的(由编译器决定)。从 C99 和 C++11 标准版本起,规定商向零取整(舍弃小数部分);取模的符号即与被除数相同。从此以下运算结果保证为真:
5 % 3 == 2; 5 % -3 == 2; -5 % 3 == -2; -5 % -3 == -2;
参考 https://oi-wiki.org/math/number-theory/basic/#cc
这里先说说 ++ 和 --。它们其实运算相似。以 a++ 为例:
- 让
a的值加 1; - 返回
a加 1 前的值(或者说a - 1的值)。
这里只说四个 +、-、++、--,其它的学到再讲。
赋值运算符都是围绕 = 展开的。这个运算符会做两件事(以 a = b 为例):
- 设置
a的值为b的值; - 返回
a的值。
其它的都类似,比如 a += b 等价于 a = a + b。
以 a, b 为例:
- 执行
a; - 执行并返回
b。