2014-09-10 39 views
-2

首先,这是一个试图了解运算符优先级如何工作和我没有在我的任何项目中使用。奇怪的运算符优先级和解引用

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 

有人能告诉我这是怎么发生的? 谢谢

+4

HTTP:/ /en.wikipedia.org/wiki/Sequence_point – 2014-09-10 09:17:53

回答

3

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

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

的C++标准说(1.9p7),

在执行序列中某些特定的点称为序列 点,所有的副作用以前的评估应完整,并且后续评估的副作用不应发生。

例如,如果一个表达式包含子表达式y ++,则变量y将被下一个序列点加1。此外,如果仅在序列点之后的表达式包含 子表达式++ z,则在到达序列点时,z在 时刻还没有增加。

个体经营者和单个表达式的子表达式,并且其中的副作用发生的顺序的操作数的评价的顺序,是不确定的

上序列点附加信息:https://stackoverflow.com/a/4176333/1938163

+0

谢谢,虽然奖金错误不是一个错误* a ++递增a + 1,因此现在指向一个[1],所以要获得我必须的所有数组值使用*(a-1),* a,*(a + 1) – 2014-09-10 10:04:15

+0

没错,我在编辑它。谢谢 – 2014-09-10 10:04:44