August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
表达式中子表达式计算顺序所遵循的规则,是按优化编译器的需求设计的,而不是为了方便程序员。这很不幸,但不管怎样你应该避免复杂的表达式,有一条简单的原则可以帮你远离麻烦:如果你在表达式中改变一个变量的值,不要在同一个表达式中再读或写这个变量。例如:
不幸的是,如果你写出这样有问题的代码,并不是所有编译器都能给出警告。这段代码的问题在于,如果你将代码迁移到另外一台计算机,使用另一个编译器,或者改变编译器优化设置,运行结果不保证一致。不同的编译器确实会对这段代码得到不同结果,所以不要这么编写程序。
特别要注意的是,=(赋值符)在表达式中只是又一种运算符而已,并没有特殊的地位,因此不能保证赋值符左边的子表达式在右边的子表达式之前计算。这就是为什么v[++i]=i;结果是不确定的。