核心要点速览
- 逻辑运算符(
&&/||):支持短路求值,右操作数可能不执行 - 逗号运算符(
,):按左到右执行多个表达式,返回最后一个值,优先级最低 - 右结合运算符:赋值运算符(=)、条件运算符(
?:)、单目运算符,优先级相同时从右到左执行
一、逻辑运算符的短路求值(&& / ||)
核心规则
短路求值是逻辑运算符的优化特性,仅在必要时计算右操作数,直接影响代码执行结果。
&&(逻辑与):左操作数为false时,直接返回false,右操作数不执行。||(逻辑或):左操作数为true时,直接返回true,右操作数不执行。
常见场景(含副作用表达式)
-
&&短路示例:int i = 0; bool res = (i == 1) && (++i); // 左为false,右++i不执行 // 结果:res=false,i=0(而非1) -
||短路示例:int j = 0; bool res = (j == 0) || (++j); // 左为true,右++j不执行 // 结果:res=true,j=0(而非1)
易错点
- 禁止将 “必须执行的代码”(如变量更新、数据写入)放在短路运算符右侧,可能因短路导致逻辑失效。
- 区分
&&/||(有短路特性)与&/|(按位运算,无短路,左右操作数均执行)。
二、逗号运算符(,)
核心规则
- 执行顺序:按从左到右依次执行所有表达式。
- 返回值:最终返回最后一个表达式的值。
- 优先级:C++ 中优先级最低(低于赋值运算符),需用括号明确执行逻辑。
典型场景(含陷阱)
- 优先级陷阱(与赋值结合):
int a = 1, 2; // 错误:等价于(a=1),2,赋值语句不合法
int a = (1, 2); // 正确:返回最后一个表达式,a=2
- for 循环多操作场景:
for (int i=0, j=5; i<5; i++, j--) { ... }
// 初始化:i=0和j=5同时执行;更新:i++和j--按顺序执行
考察点
- 考察 “返回最后一个表达式值”,常结合赋值语句预判结果。
- 区分 “变量声明中的逗号”(非运算符),如
int a, b;是声明两个变量,并非逗号运算符。
三、右结合运算符(优先级相同时的执行顺序)
概念
结合性指 “多个优先级相同的运算符连续出现时的执行顺序”,C++ 中多数运算符为左结合,仅以下三类为右结合。
三类右结合运算符
1. 赋值运算符(=)
-
规则:从右到左执行,支持链式赋值。
-
示例:
int a, b, c; a = b = c = 5; // 右结合:先c=5 → 再b=c → 最后a=b,结果a=b=c=5 -
易错点:
a = 3, 4等价于(a=3),4,a 的值为 3(非 4),因逗号运算符优先级更低。
2. 条件运算符(?:)
- 规则:唯一的右结合双目运算符,嵌套时从右向左解析。
- 嵌套示例:
int x=1, y=2, z=3; int res = x>y ? x : y>z ? y : z; // 等价于x>y ? x : (y>z ? y : z) // 结果:res=3(y>z为false,取z=3)
3. 单目运算符
-
包含:前缀
++、前缀--、*(解引用)、&(取地址)、!、~、+(正)、-(负)、sizeof等。 -
规则:从右到左执行,常结合指针操作考察。
-
指针示例:
int a=5; int* p=&a; ++*p; // 右结合:先*p(取a=5)→ 再++,结果a=6 -
易错点:区分前缀(右结合)和后缀
++/--(左结合),如*p++是左结合,先*p再p++。
四、表达式求值的核心规则
表达式的求值结果由两大因素决定,这也是理解复杂表达式的关键:
- 运算符优先级:决定不同运算符的执行顺序(如
*优先级高于+)。 - 结合性:当多个优先级相同的运算符连续出现时,决定执行顺序(左结合 / 右结合,如前文的右结合运算符)。
示例:综合优先级与结合性
int a = 2, b = 3, c = 4;
int res = a + b * c / 2;
// 优先级:*、/ 高于 +,且 * 和 / 左结合 → 先算 b*c=12,再 12/2=6,最后 a+6=8 → res=8
int x = 10, y = 20;
bool flag = x > 5 || y++ > 15;
// 优先级:> 高于 ||;|| 短路求值 → 左操作数x>5为true,右操作数y++不执行 → flag=true,y=20
五、表达式的 “副作用”
表达式在求值过程中,若修改了操作数的值(如++、--、赋值),则产生 “副作用”。副作用可能导致表达式求值结果依赖执行顺序,需特别注意:
int i = 1;
int res = i++ + i++;
// 未定义行为!C++标准未规定两个i++的执行顺序,不同编译器可能返回2(先算左再右)或3(先右再左)
规则:避免在同一表达式中对同一变量进行多次修改(如i++ + i++),此类代码行为未定义。

被折叠的 条评论
为什么被折叠?



