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

C++ 运算符优先级不为';t在c+中的行为不符合预期+;,c++,c,c++11,operator-precedence,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(); } 但结果是 Plus Multipication 9 !! 编译器解析器中发生了什么?!编译器更喜欢运算

考虑以下代码:

int func1()
{
    cout<<"Plus"<<endl;
    return 1;
}
int func2()
{
   cout<<"Multiplication"<<endl;
   return 2;
}
int main()
{
  cout<<func1()+4*func2();
}
但结果是

Plus 
Multipication
9
!! 编译器解析器中发生了什么?!编译器更喜欢运算符关联吗?
所有c/c++编译器中的输出是否相同?

运算符优先级与求值顺序不同。

您无法保证求值的顺序——只要得到正确的结果,编译器就可以在表达式中随意调用任意顺序的函数


(次要限定:任何引入A(包括运算符)的内容都会对求值顺序产生影响,但在这种特殊情况下表达式中没有序列点。)

运算符优先级与求值顺序不同。

您无法保证求值的顺序——只要得到正确的结果,编译器就可以在表达式中随意调用任意顺序的函数



(次要限定:任何引入A(包括运算符)的内容都会对评估顺序产生影响,但在这种特殊情况下,表达式中没有序列点。)

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

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

运算符优先级与功能评估顺序无关。看到结果是<代码> 9 而不是<代码> 10 >代码>,正如“代码> +/>代码>优先显示的那样。C++标准中没有任何东西被称为调用其他函数的函数。例如:
func(getchar(),getchar()),输入“ab”,不知道
func
的第一个或第二个参数中是否包含“a”——因为编译器可以按照自己喜欢的方式对这些getchar进行排序。这是C和C++标准的一部分,所以要和它一起生活。你可能不接受它,但这就像不接受重力而希望从高处跳下时不会摔倒一样。
coutWell,运算符优先级已经定义。组成表达式函数的多个函数调用的顺序不是。无论是在
4*x
之前还是之后执行
++x
,也不重要-只定义
++x
在整个表达式结束之前执行-这就是您可能无法获得预期结果的原因。因此,如果你做了代码> CUT@ OMID<代码> 4 *X/++X在C和C++中都是明确定义的(如果代码< x/COD>类型是<代码> int <代码>)。了解计算顺序:or运算符优先级与函数计算顺序无关。看到结果是<代码> 9 而不是<代码> 10 >代码>,正如“代码> +/>代码>优先显示的那样。C++标准中没有任何东西被称为调用其他函数的函数。例如:
func(getchar(),getchar()),输入“ab”,不知道
func
的第一个或第二个参数中是否包含“a”——因为编译器可以按照自己喜欢的方式对这些getchar进行排序。这是C和C++标准的一部分,所以要和它一起生活。你可能不接受它,但这就像不接受重力而希望从高处跳下时不会摔倒一样。
coutWell,运算符优先级已经定义。组成表达式函数的多个函数调用的顺序不是。无论是在
4*x
之前还是之后执行
++x
,也不重要-只定义
++x
在整个表达式结束之前执行-这就是您可能无法获得预期结果的原因。因此,如果你做了代码> CUT@ OMID<代码> 4 *X/++X在C和C++中都是明确定义的(如果代码< x/COD>类型是<代码> int <代码>)。了解评估顺序:或者短路逻辑运算符是例外吗?是的,任何引入序列点(包括短路运算符)的内容,会对评估顺序产生影响。@Sergey:谢谢-这种优先顺序和评估顺序的混淆经常出现,我认为它值得额外强调一点。;-)请注意,从C++11标准开始,“序列点”一词就不存在了。@omid:再考虑一下-您可以先计算
4*func2()
,然后将其添加到
func1()
-或者您可以先计算
func1(),然后将其添加到
4*func2()`-结果相同,在这两种情况下,您都尊重运算符优先级,但求值顺序不同。短路逻辑运算符会是例外吗?是的,任何引入序列点(包括短路运算符)的情况,会对评估顺序产生影响。@Sergey:谢谢-这种优先顺序和评估顺序的混淆经常出现,我认为它值得额外强调一点。;-)请注意,从C++11 standard开始,“序列点”一词就不存在了。@omid:再考虑一下-您可以先计算
4*func2()
,然后将其添加到
func1()
-或者
Plus 
Multipication
9