优先级仅规定了表达式的组合方式,而没有对运算对象的求值顺序进行规定。
举个乘法*
运算为例:
f1()*f2();
乘法仅仅是规定了运算对象是f1()
和f2()
,且在乘法之前,两个f
都被求值了,至于是f1
先还是f2
先没有进行规定,假如你抱有以下幻想:
- f1影响作用于f2
- f2影响作用与f1
那你还是放弃这个想法,因为这个顺序是随机的,以“f1影响作用于f2”为例,可能f2
在求值时还没有施加f1
影响,结果不符合预期。
再看一个例子,如
int i=0;
cout<<i<<" "<<++i<<endl;
表达式是先执行++i
还是先执行打印是不确定的。需要特别注意。但是也有例外:
- 逻辑与
&&
左侧为假不会进行右侧求值 - 逻辑或
||
左侧为假才进行右侧求值 - 条件运算符
:?
左侧为真才进行右侧求值 - 逗号运算符
,
从左往右依次执行