gpt4 book ai didi

c - 为什么 v[i] = i++ 在 C 中是未定义的行为?

转载 作者:行者123 更新时间:2023-12-04 10:46:00 25 4
gpt4 key购买 nike

阅读一篇关于 ACCU 重载的有趣文章 #115:“恶魔可能会飞出你的 Nose ”我发现作者说:

between sequence points you are not allowed to make any assumptions about the state of involved variables. This also means that in C, unlike most other languages, the following expression leads to undefined behaviour

v[i] = i++;

because the assignment operator does not represent a sequence point in C

谁能解释一下这里暗示 UB 的详细推理是什么?我认为这将是在两个序列点之间对同一个变量进行多次写入的问题,我在这里看不到,除了 v[i] 别名 i 的可能性......

最佳答案

这不仅仅是写。当您不知道是在读取变量的旧值还是新值时,读取也会发挥作用。在这种情况下,无法确定 v[i] 是指 i 的旧值还是 i 的新值。

例如,表达式v[i] = i++可以解释为

  1. 执行赋值:v[i] = i
  2. 自增 i

或者,换句话说,它可以解释为

  1. 获取i的旧值:i_old = i
  2. 自增 i
  3. 执行赋值:v[i] = i_old

如您所见,代码的行为会根据其解释方式的不同而发生变化。这些只是两种可能的不一致情况的示例。

但是语言并没有将行为限制在如此有限的场景中。相反,该语言表示行为是未定义的,这意味着除其他外,编译器可以自由拒绝以任何“可预测”的方式解释此代码。

关于c - 为什么 v[i] = i++ 在 C 中是未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17458429/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com