求值顺序
大多数情况下不会指定求值顺序
对于那些没有指定执行顺序的运算符来说,如果表达式指向并修改同一个对象,将会引发错误并产生未定义行为
// << 运算符没有明确规定何时对运算对象求值
int i = 0;
cout<< i << " "<< ++i <<endl; // 未定义的
因为上诉程序是未定义的原因**,编译器可能先求++i的值再求i的值**,或则先求i的值然后再求++i的值,甚至编译器还可能做出完全不同的操作.因此表达式的行为不可预知。
四种运算符明确规定了运算对象的求值顺序
(只有当左侧运算对想法的值运行完了之后才运行右侧的).
- &&
- ||
- ?:
- ,
处理复合表达式建议:
- 拿不准时用括号
- 如果改变了一个运算对象的值,在表达式的其他地方就不要在使用这个运算对象(当改变运算对象的子表达式本身就是另外一个子表达式的运算对象时,是可以的 如:*++iter