for循环中未定义的行为 - 表达式分离是否应该明确定义?

时间:2012-02-15 20:06:32

标签: c++ undefined-behavior

我知道这个主题在SO上被打死了一点,但我仍然对下面显示的情况感到有些困惑 - 多人似乎都认为这是正确的。

据我所知,如果没有介入的序列点而不是未定义的行为,则不能多次修改/使用修改后的变量。我认为在for循环中,i != 0;i < n;i--都是单独的表达式,在已知时间进行评估,并由序列点分隔(因为它们是完整表达式)。

为什么会产生未定义的行为?

forum Image

取自论坛:http://www.frihost.com/forums/vt-48979.html

3 个答案:

答案 0 :(得分:5)

对于帖子的原始代码

for (i = 0; i < n; i--)

由于有符号整数运算的工作方式,代码是未定义的。无法保证i将永远包裹并变得积极。使用无符号算术时,代码将被定义(但行为未指定,因为unsigned int的大小未指定)。

对于与屏幕截图对应的行,变量i永远不会被初始化,因此未定义行为。

答案 1 :(得分:2)

for (i = 0; i < n; i--)

如果i是有符号整数并且i--表达式使i溢出,则代码是未定义的行为。 (实际上在C语言中,只有有符号整数才能溢出。)

答案 2 :(得分:0)

其他答案评论的代码与实际发布的代码不同。该代码最初是一个难题,建议的解决方案之一是编写以下内容:

for (i != 0; i < n; i--)

这个问题是它永远不会为i分配初始值。通常,这会进入for - 构造的第一部分,但这里已被重写为(完全没有意义的)i != 0。 (它毫无意义,因为它没有副作用,它的价值没有被使用 - 但是,嘿,这是一个难题。)

因此,这可以运行循环任意次。