验证指定C++逗号表达式代码是否存在未定义行为(UB)
C++代码的未定义行为分析
第一段代码:无未定义行为
int a = 0; cout<<(a++, ++a, a++, ++a, a++)<<"\n";
这段代码完全没有未定义行为。核心原因是这里用的是C++内置的逗号运算符,它强制从左到右依次执行每个子表达式,并且前一个表达式的所有副作用(比如a的自增)会在执行下一个表达式前彻底完成。
具体执行步骤:
- 初始
a = 0 a++:返回0,a变成1++a:返回2,a变成2a++:返回2,a变成3++a:返回4,a变成4a++:返回4,a变成5
整个逗号表达式的结果是最后一个子表达式的值4,所以程序会稳定输出4,行为完全可预测。
第二段代码:存在未定义行为
int a = 0; cout << a++ << " " << ++a << " " << a++ << "\n";
这段代码确实存在未定义行为(针对C17之前的标准)。问题出在<<运算符的多个操作数之间没有固定的求值顺序——编译器可以任意选择a++、++a这些子表达式的执行顺序。而这些操作都在修改同一个变量a,且没有序列点分隔这些修改操作,这直接触发了C标准中的未定义行为规则。
哪怕在C++17标准中,<<的操作数被规定为从左到右求值,消除了未定义行为,但这段代码在旧标准环境下的行为依然不可控,所以实际开发中应该避免这种写法。
内容的提问来源于stack exchange,提问作者Migo
相关产品推荐
相关产品推荐

