考虑以下代码:
int func1()
{
cout<<"Plus"<<endl;
return 1;
}
int func2()
{
cout<<"Multiplication"<<endl;
return 2;
}
int main()
{
cout<<func1()+4*func2();
}
根据这个page *运算符的优先级高于+运算符所以我希望结果是:
Multiplication
Plus
9
但结果是
Plus
Multipication
9
!! 编译器解析器发生了什么?编译器是否更喜欢操作员关联? 所有c / c ++编译器中的输出是否相同?
答案 0 :(得分:27)
运算符优先级与评估顺序不同。
您无法保证评估顺序 - 只要您获得正确的结果,编译器就可以在表达式中以任何顺序调用函数。
(次要资格:引入sequence point(包括short circuit运算符)的任何内容都会对评估顺序产生影响,但在此特定情况下表达式中没有序列点。)
答案 1 :(得分:8)
编译器可以按任意顺序自由地评估函数 - 表达式中唯一保证评估顺序的是序列点;三元条件运算符||
的运算符&&
,,
,?
和? :
是序列点。在每种情况下,左侧都会在触摸右侧之前评估其所有值和副作用。