奇怪的运算符优先级和解除引用

时间:2014-09-10 09:16:31

标签: c++ operators dereference

首先,这是尝试理解运算符优先级如何工作,而不是我在任何项目中使用。

int *a=new int[3];
a[0]=3;a[1]=7;a[2]=11;
*a*=++*a**a++;
cout<<*(a-1)<<endl<<*a<<endl<<*(a+1);

提供以下输出

4
112
11

我期待以下输出,

64
7
11

有人可以告诉我这是怎么回事吗? 谢谢

1 个答案:

答案 0 :(得分:3)

即使尊重运算符优先级,您也不会尊重sequence points,从而调用未定义的行为。

在这里查看cpp常见问题:http://www.parashift.com/c++-faq/sequence-points.html

  

C ++标准说(1.9p7),

     

在执行序列中的某些指定点,称为序列   要点,先前评估的所有副作用应完整   不得进行后续评估的副作用。

     

例如,如果表达式包含子表达式y ++,那么   变量y将增加下一个序列点。此外   如果序列点后面的表达式包含   subexpression ++ z,那么z还没有增加   到达序列点的那一刻。

单个运算符的操作数和各个表达式的子表达式的评估顺序以及副作用发生的顺序是未指定的

有关序列点的其他信息:https://stackoverflow.com/a/4176333/1938163