“常量、变量、函数调用” 和 “用运算符把它们或表达式连接在一起” 的语句是表达式。表达式可以有返回值,也可以没有返回值。表达式还能修改一些变量的值。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
。