引用相同地址的算术指针

Arithmetic Pointers referencing same addresses

我有点难以理解以下操作:

B是可变的,Pt1和Pt2都指向&B

递减是在做作之后完成的,所以按照我的逻辑应该是 68 但我的 IDE 给了我 69,有人可以解释一下吗?

提前致谢。

您提供的代码产生了未定义的行为!去掉指针方面,你实际上是在这样做:

B = B--;

这无法一致地解决,因为您正在分配 B 69then 的值post-递减 B。那么,哪个给出了答案:赋值还是 post-递减?

对于您的 platform/IDE,编译器使用 'temporary' 变量做了类似的事情:

// Initial value of B is 69
temp = B--; // temp is 69 and B is now 68
B = temp;   // B now has the value of 69!

但是,您不能依赖这个 'interpretation' - 无论是跨不同的编译器,还是在不同的地方使用相同的编译器使用相似的代码!

PS:顺便说一句,你应该post编码为文本,格式化为代码块。

C 标准 6.5 对这种现象给出了这种神秘的解释:

If a side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined. If there are multiple allowable orderings of the subexpressions of an expression, the behavior is undefined if such an unsequenced side effect occurs in any of the orderings.

  • "Scalar object" 在这种情况下意味着您的原始变量指向。
  • "Value computation" 在这种情况下取​​消引用其中一个指针。它们指向同一个变量。
  • "Side-effect" 在这种情况下意味着修改一个变量。 = 赋值和 -- 运算符都是副作用。

赋值运算符未指定其操作数的求值顺序 (6.5.16 "The evaluations of the operands are unsequenced.")。未指定 *Pt2 是在 *Pt1-- 之前还是之后。

这意味着编译器处于必须同时更新同一个变量两次的情况。由于这不是一个定义明确的场景,编译器可能会生成不正确的代码。可以显示奇怪值甚至崩溃的代码。这被称为 未定义的行为 - 一个错误,使您的程序处于无法再依赖确定性行为或预测任何结果的状态。

避免这种情况的简单方法是遵循以下最佳实践规则:

切勿在同一表达式中将 ++ 或 -- 运算符与其他运算符一起使用。