为何C语言在分配和后递增迭代器时会出现无限循环的bug?

2026-04-16 19:002阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计423个文字,预计阅读时间需要2分钟。

为何C语言在分配和后递增迭代器时会出现无限循环的bug?

参看英文答案+为什么使用前置和后置递增运算符的构造会引发未定义行为?14种未定义行为和序列点5个近期在个人C应用中发现的一个奇怪错误,调试时发现代码进入无。

参见英文答案 > Why are these constructs using pre and post-increment undefined behavior?14个
> Undefined behavior and sequence points5个
前几天我在我们的一个C应用程序中遇到了一个奇怪的错字,触发了代码进入无限循环.在for循环结束时,程序员意外地分配了i = i,而不仅仅是递增i.

for (int i = 0; i < 10; i = i++) { cout << "i = " << i << endl; }

输出:

i = 0 i = 0 i = 0 ...

最奇怪的是,即使理解这是一个错字,我也看不出为什么这段代码不起作用.据我所知,分配给i应该没有影响,因为我仍然应该在分配后增加. (出于某种原因,它必须改为复制一份?但这似乎没有意义.)

另一个有趣的事情是将赋值更改为i = i不会产生无限循环.

这段代码在我们之前的编译器上没有产生无限循环:gcc版本4.4.7 20120313.我们最近升级到gcc版本4.8.5 20150623,现在确实如此.

问题是为什么这个代码在逻辑上看起来不应该产生无限循环,哪个编译器根据C标准正确地解释了这个?

i = i的行为是未定义的(在未经测序的步骤中同时读写 – 并且在标准中).永远不要使用它.

注意,i = i是从C 11定义的.

至于编译器错误的思考.你找到一个并不是不可能的,但这是极不可能的,特别是如果怀疑的表达如此之小.

为何C语言在分配和后递增迭代器时会出现无限循环的bug?

标签:无限GCC

本文共计423个文字,预计阅读时间需要2分钟。

为何C语言在分配和后递增迭代器时会出现无限循环的bug?

参看英文答案+为什么使用前置和后置递增运算符的构造会引发未定义行为?14种未定义行为和序列点5个近期在个人C应用中发现的一个奇怪错误,调试时发现代码进入无。

参见英文答案 > Why are these constructs using pre and post-increment undefined behavior?14个
> Undefined behavior and sequence points5个
前几天我在我们的一个C应用程序中遇到了一个奇怪的错字,触发了代码进入无限循环.在for循环结束时,程序员意外地分配了i = i,而不仅仅是递增i.

for (int i = 0; i < 10; i = i++) { cout << "i = " << i << endl; }

输出:

i = 0 i = 0 i = 0 ...

最奇怪的是,即使理解这是一个错字,我也看不出为什么这段代码不起作用.据我所知,分配给i应该没有影响,因为我仍然应该在分配后增加. (出于某种原因,它必须改为复制一份?但这似乎没有意义.)

另一个有趣的事情是将赋值更改为i = i不会产生无限循环.

这段代码在我们之前的编译器上没有产生无限循环:gcc版本4.4.7 20120313.我们最近升级到gcc版本4.8.5 20150623,现在确实如此.

问题是为什么这个代码在逻辑上看起来不应该产生无限循环,哪个编译器根据C标准正确地解释了这个?

i = i的行为是未定义的(在未经测序的步骤中同时读写 – 并且在标准中).永远不要使用它.

注意,i = i是从C 11定义的.

至于编译器错误的思考.你找到一个并不是不可能的,但这是极不可能的,特别是如果怀疑的表达如此之小.

为何C语言在分配和后递增迭代器时会出现无限循环的bug?

标签:无限GCC