c++ - 表达式的行为 : Defined or Undefined?

标签 c++ c undefined-behavior sequence-points

我有以下代码

int m[4]={1,2,3,4}, *y; 
y=m; 
*y = f(y++); // Expression A

我的 friend 告诉我,表达式 A 具有明确定义的行为,但我不确定他是否正确。

根据他的说法,函数 f() 在两者之间引入了一个 sequence point,因此行为定义明确。

有人请澄清。

P.S:我知道我们不应该出于实际目的编写这样的代码。这只是为了学习。 :)

最佳答案

充其量,相关代码具有未指定的行为。对于赋值运算符,“操作数的求值顺序未指定”(C99 §6.5.16/4)。

如果先计算左操作数,则f(y++) 的结果将存储在m[0] 中。如果先计算右操作数,则结果将存储在 m[1] 中。

关于行为是否未定义,相关段落是:

Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be read only to determine the value to be stored (C99 §6.5/2).

如果左边先求值,那么我们就会与第二个句子发生冲突,因为顺序是:

  1. 在左侧读取 y 的值以取消引用它
  2. 在右侧读取 y 的值以增加它
  3. 在对函数的参数求值之后有一个序列点(因此,y++ 的副作用已经完成,y 被写入)

在第 1 步中,读取 y 的“先验值”,但目的不是“确定要存储的值”。因此,该行为确实是未定义的,因为一个有效的评估顺序会产生未定义的行为。

关于c++ - 表达式的行为 : Defined or Undefined?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3325761/

相关文章:

c++ - 将复杂参数放入 min 函数时出错?为什么?(Eclipse C++)

c - 返回一个字符指针数组

c - 为什么这些指针显示不同的地址?

c++ - 正如 Clang 似乎表明的那样,这段代码真的是未定义的吗?

c++ - 硬件 SIMD vector 指针和相应类型之间的 `reinterpret_cast` 是未定义的行为吗?

c++ - 简单代码导致错误读取变量: Cannot access memory at address

c++ - Qt - 为 QML 定义全局函数

c++ - 为什么struct node*写在struct node里面?

c - 我无法在 C 中正确创建双向链表

c - 数组外指针比较的基本原理是 UB