C++中循环条件表达式的第二部分是否会被编译器优化移除?
关于C++循环条件中逗号表达式的编译器优化问题
你的担心是多余的,合规的C编译器绝对不会移除while条件中(csv += ", ", true)这部分代码,C标准对此有明确的规则约束:
核心规则依据
As-if规则:编译器优化的前提是不能改变程序的可观察行为。
csv += ", "会直接修改字符串csv的内容,这属于程序的可观察行为,任何优化都不能忽略这个副作用——否则生成的CSV字符串会丢失逗号分隔符,和原代码的预期行为完全不符,违反标准要求。逻辑与
&&的求值顺序:C++标准规定,&&是短路运算符,只有当左侧表达式++i != e的值为true时,才会计算右侧表达式。同时,左侧表达式的所有求值和副作用,会严格先于右侧表达式的执行。逗号运算符的求值规则:对于逗号表达式
E1, E2,标准要求先执行E1并完成所有副作用,再执行E2,最终表达式的值为E2的值。这里的csv += ", "是E1,true是E2——只要进入右侧表达式的计算,csv += ", "就一定会被执行,编译器没有理由跳过它。
代码逻辑的合理性补充
这段代码里用(csv += ", ", true)的目的,是在完成逗号追加操作的同时,让整个右侧表达式的值为true,保证while循环能继续执行(直到++i == e时终止)。由于上述标准规则的约束,这个逗号追加的操作必然会被执行,不会被优化移除。
内容的提问来源于stack exchange,提问作者Serge Roussak
相关产品推荐
相关产品推荐

