CppCoreGuidelines ES.43 避免求值顺序未定义的表达式
17 April 2023
“Avoid expressions with undefined order of evaluation”
理由
有时候你无法判断代码到底做什么。可移植性的考量。就算你自己清楚代码在做什么,不同的编译器可能有不同的翻译。甚至你当前用的编译器的下一个版本翻译的都会不一样。或者不同的编译器选项会导致不同的求值结果。
注意
C++17 强化了求值顺序规则:一般都是从左到右,除了赋值操作是从右到左。但是没有定义函数参数列表的求值顺序规则。
请记住,如果你的代码能用C++17之前的编译器编译,但是不要太侥幸。
例子
int i = 10; int v[20]; v[i] = ++i; // the result is undefined cout << v[i];
11
总归一句话,不要在一个表达式中多次读取一个变量的值。
强化
好的代码分析工具能够提出告警。