我知道这个主题在SO上被打死了一点,但我仍然对下面显示的情况感到有些困惑 - 多人似乎都认为这是正确的。
据我所知,如果没有介入的序列点而不是未定义的行为,则不能多次修改/使用修改后的变量。我认为在for循环中,i != 0;
,i < n;
和i--
都是单独的表达式,在已知时间进行评估,并由序列点分隔(因为它们是完整表达式)。
为什么会产生未定义的行为?
答案 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
。 (它毫无意义,因为它没有副作用,它的价值没有被使用 - 但是,嘿,这是一个难题。)
因此,这可以运行循环任意次。