🔷 第三章 运算符与表达式
📄 一句话概括

逗号运算符 , 把几个式子从左到右挨个算完,整个表达式的值取最后一个。存在感最低的一位,但第 5 章 for 循环里会正经用到——现在认识它,别和"逗号分隔符"混了。

一、规矩:排队干活,只交最后一份答卷

(式子1, 式子2, 式子3)
  ↓      ↓      ↓
 先算   接着算  最后算 ← 整个表达式的值 = 它
int x = (1, 2, 3);    // 挨个算 1、2、3,x = 3
int y = (a + 1, b * 2);  // 先算 a+1(扔掉),再算 b*2,y = b*2

括号必须加——不加的话,逗号会被当成"变量清单的分隔符"(比如 int a, b; 里的逗号),那是分隔符不是运算符。两种身份的区分:

二、前面的"白算"了吗?——副作用不白算

x = (1, 2, 3) 里前两个数字确实白算。但如果前面的式子有副作用(改变变量),就一点不白算:

int i = 0;
int x = (i += 5, i * 2);   // 先把 i 改成 5(副作用留下),再算 i*2,x = 10

第一个式子的值被扔了,但它对 i 的改动留下来了。这就是逗号运算符的正确用法:"顺便干点活,最终只要一个值"。

三、真正的用武之地:for 循环

第 5 章你会正式遇到这样的写法:

for (int i = 0, j = 9; i < j; i++, j--) {
    // i 从头走、j 从尾走,两头向中间夹
}

括号里和更新段里的逗号,让一段塞进两个动作。现在不用深究 for 的语法(第 5 章),只要记住:到时候看见逗号,就是"排队挨个算"。

日常代码里逗号运算符存在感很低——认识它、读得懂别人写,就够了,别主动滥用(可读性差)。

四、30 秒实验

#include <iostream>
using namespace std;

int main() {
    int a = 1;
    cout << (a += 3, a * 2) << endl;   // 8:先 a 变 4,再 4*2
    int x = (10, 20, 30);
    cout << x << endl;                  // 30
    cout << 10, 20, 30 << endl;         // 看输出:只有 10!逗号被 << 的优先级拆散了
    return 0;
}

看到什么算成功:8、30、10——第三行是个坑:<< 优先级高于逗号,整个式子被拆成"cout << 10、然后逗号排队",后面全被丢掉。教训:逗号运算符参与复杂表达式时必须整体套括号。

五、常见误区

  1. "int a, b; 里的逗号是逗号运算符"——那是分隔符。运算符身份只出现在表达式里(通常带括号)。
  2. "整体取第一个式子的值"——取最后一个。
  3. "cout << 1, 2, 3 会输出 1 2 3"——只输出 1(优先级把逗号拆散了),这是"忘加括号"的现场教学。
  4. "逗号运算符很有用要常用"——恰恰相反:认识它、读懂它、别主动写。它的正当舞台只有 for 循环这种特定位置。
自测三问(点开对答案) 1. `int x = (5, 8);` 之后 x 是多少?——`8`(取最后一个)。 2. `(i = 3, i * 2)` 的值和副作用?——值是 6;副作用是 i 被改成 3。 3. `int a, b;` 和 `x = (a, b);` 里的逗号身份分别是什么?——前者是声明分隔符,后者才是逗号运算符。

相关笔记