【问题标题】:Setting value equal to itself设置值等于自身
【发布时间】:2013-11-07 19:17:04
【问题描述】:

我不知道在哪里搜索这个(可能是标准但仍然不知道要搜索什么),所以我会在这里问这个。

如果在某些执行中array[i2] 将设置为array[i],其中i2 恰好等于i,那么这是定义的行为吗?

我正在使用 C99(使用 gcc 4.8.1),使用 gcc -S 查看程序集,我没有发现任何可疑之处。

【问题讨论】:

  • 编译器甚至可以优化它。
  • 它不会,因为它取决于运行时执行。这就是我注意到“在某些执行中”的原因。它实际上更像是 array[idx] = array[i],其中 idx 恰好等于 i。
  • @Silverrocker:指定你的意思是什么依赖。
  • 我已更新问题以澄清情况。
  • 这可能与“int i, j; j = i”相同。读 i 是未定义的,所以你可以说整个语句是未定义的。对于之前未分配的数组元素也是如此。

标签: c gcc standards c99 undefined-behavior


【解决方案1】:

这是绝对定义的行为。首先计算分配的右侧,然后分配到左侧。请注意,左侧必须解析为左值。

【讨论】:

  • 请注意,这实际上与将变量设置为等于自身相同。这会改变情况吗?
【解决方案2】:
foo() {
  int i, j, a[5], b[5];
  i = i; // undefined because reading i is UB
  j = i; // undefined because reading i is UB
  a[i] = a[i]; // undefined because reading i is UB
  a[3] = a[3]; // undefined because reading a[3] is UB
  b[3] = a[3]; // undefined because reading a[3] is UB
}

【讨论】:

  • 如果变量被初始化,那么它就被定义了,对吗?
  • 好的,我认为这可能与序列点有关,但似乎并非如此。谢谢。
【解决方案3】:

如果变量i 具有有效值则赋值

i = i;

具有完美定义的行为。如前所述,这等同于您的问题。

如果您的情况更棘手,您必须提供更多详细信息。

【讨论】:

  • 仅此而已,因此您的答案适用。谢谢!
猜你喜欢
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多