17 April 2023

C++ 核心指南目录

“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

总归一句话,不要在一个表达式中多次读取一个变量的值。

强化

好的代码分析工具能够提出告警。