C/C++ if条件中逗号运算符为何输出Second
输出
Second的原因解析 要搞懂这个运行结果,只需要把逗号运算符规则、自减运算符规则、C/C++条件判断规则对应上,逐行拆解执行流程即可,不存在反直觉的特殊逻辑。
首先明确三个基础规则:
- 逗号运算符是左结合运算符,求值顺序严格从左到右,每计算完一个左侧操作数就直接丢弃它的返回值,整个逗号表达式的最终返回值和类型,完全等于最右侧操作数的结果。
- 自减运算符的行为差异:后置
x--会先返回x的当前值,再对x执行减1操作;前置--x会先对x执行减1操作,再返回减完后的x值。 - C/C++的分支判断逻辑中,整型值
0等价于逻辑假(false),所有非0整型值等价于逻辑真(true)。
涉及的完整代码如下:
#include<iostream> using namespace std; int main(){ int x =2; if( x--, --x, x){ cout<<"First"; }else{ cout<<"Second"; } return 0; }
逐行跟踪变量和表达式的执行过程:
- 初始定义
int x =2,此时x的内存值为2。 - 开始计算if条件里的逗号表达式
x--, --x, x,严格从左到右依次执行:- 第一步执行
x--:因为是后置自减,先取出x当前值2(这个值会被直接丢弃,不会作为判断依据),再把x的值减1,执行完成后x=1。 - 第二步执行
--x:因为是前置自减,先把x的值减1(x从1变为0),再返回x当前值0(这个值同样会被丢弃),执行完成后x=0。 - 第三步执行最右侧的
x:直接读取x当前的内存值0,这个值就是整个逗号表达式的最终结果。
- 第一步执行
- if拿到的条件值为0,对应逻辑假,因此不会进入if对应的
First输出分支,而是跳转到else分支执行,最终输出Second。
容易踩的误区是误以为逗号表达式会保留前面的非0值作为判断依据,实际上逗号运算符只会把最右侧表达式的结果作为整个表达式的返回值,前面的所有操作仅会产生副作用(比如这里的两次自减修改了x的值),返回值都会被直接丢弃。
内容的提问来源于stack exchange,提问作者Diksha Sharma
相关产品推荐
相关产品推荐

