【问题标题】:Strange Operator Precedence and Dereferencing [duplicate]奇怪的运算符优先级和取消引用[重复]
【发布时间】:2024-01-31 04:05:01
【问题描述】:

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

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

谁能告诉我这是怎么回事? 谢谢

【问题讨论】:

标签: c++ operators dereference


【解决方案1】:

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

在此处查看 cpp 常见问题解答:http://www.parashift.com/c++-faq/sequence-points.html

C++ 标准说 (1.9p7),

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

例如,如果一个表达式包含子表达式 y++,那么 变量 y 将按下一个序列点递增。此外 如果序列点之后的表达式包含 子表达式 ++z,那么 z 在 到达序列点的那一刻。

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

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

【讨论】:

  • 谢谢,虽然奖励错误不是错误 *a++ 将 a 递增到 a+1,因此 a 现在指向 a[1],因此要获取我必须使用的所有数组值 *( a-1),*a,*(a+1)
  • 没错,我正在编辑它。谢谢