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

LxL*_*LxL 1 c c++ operator-precedence c++11

考虑以下代码:

int func1()
{
    cout<<"Plus"<<endl;
    return 1;
}
int func2()
{
   cout<<"Multiplication"<<endl;
   return 2;
}
int main()
{
  cout<<func1()+4*func2();
}
Run Code Online (Sandbox Code Playgroud)

根据这个页面*运算符的优先级高于+运算符所以我希望结果是:

Multiplication 
Plus
9
Run Code Online (Sandbox Code Playgroud)

但结果是

Plus 
Multipication
9
Run Code Online (Sandbox Code Playgroud)

!编译器解析器发生了什么?编译器是否更喜欢操作员关联?所有c/c ++编译器中的输出是否相同?

Pau*_*l R 27

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

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

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

  • @omid:再考虑一下 - 你可以首先计算`4*func2()`然后将它添加到`func1()` - 或者你可以先计算`func1()并将其添加到`4*func2( )` - 结果是相同的,在这两种情况下你都尊重*运算符优先级*,但*评价顺序*是不同的. (2认同)

Ant*_*ala 8

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