运算符优先级在c ++中的行为与预期不同

时间:2013-08-21 16:20:02

标签: c++ c c++11 operator-precedence

考虑以下代码:

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 ++编译器中的输出是否相同?

2 个答案:

答案 0 :(得分:27)

运算符优先级与评估顺序不同。

您无法保证评估顺序 - 只要您获得正确的结果,编译器就可以在表达式中以任何顺序调用函数。

(次要资格:引入sequence point(包括short circuit运算符)的任何内容都会对评估顺序产生影响,但在此特定情况下表达式中没有序列点。)

答案 1 :(得分:8)

编译器可以按任意顺序自由地评估函数 - 表达式中唯一保证评估顺序的是序列点;三元条件运算符||的运算符&&,?? :是序列点。在每种情况下,左侧都会在触摸右侧之前评估其所有值和副作用。