【问题标题】:Why this program going to infinite loop? [duplicate]为什么这个程序会无限循环? [复制]
【发布时间】:2019-07-26 16:23:17
【问题描述】:

当我将i<0,5 放在下面代码中 for 循环的条件部分时

#include<stdio.h>
int main()
{
  int i;
  for(i = 0;i<0,5;i++)
    printf("%d\n",i);
  return 0;
}

【问题讨论】:

  • i&lt;0,5 计算为 5 的值。这是真的。
  • 如果条件变为 i
  • i&lt;5 不会导致无限循环,除非 i 始终小于 5。但i&lt;0,5 与i&lt;5 不同,也与i &lt; (0,5) 不同跨度>

标签: c comma-operator


【解决方案1】:

答案是5 始终是true。
请参考以下从您的反汇编代码。
条件部分仅引用5。

move eax, 5 正在将 5 保存到 eax 寄存器。
test eax, eax 正在比较 eax 和 eax。
它必须始终相同。所以,这永远是真的。

009318FA  mov         eax,5
009318FF  test        eax,eax  
00931901  je          main+56h (0931916h) 

这是完整的代码:

        int i;
        for (i = 0; i < 0, 5; i++)
009318E8  mov         dword ptr [i],0  
009318EF  jmp         main+3Ah (09318FAh)  
009318F1  mov         eax,dword ptr [i]  
009318F4  add         eax,1  
009318F7  mov         dword ptr [i],eax  
009318FA  mov         eax,5  
        int i;
        for (i = 0; i < 0, 5; i++)
009318FF  test        eax,eax  
00931901  je          main+56h (0931916h)  
            printf("%d\n", i);
00931903  mov         eax,dword ptr [i]  
00931906  push        eax  
00931907  push        offset string "%d\n" (0937B30h)  
0093190C  call        _printf (093104Bh)  
00931911  add         esp,8  
00931914  jmp         main+31h (09318F1h) 

【讨论】:

  • 由于我不熟悉该机器级代码,我能否得到更多解释。当我执行它时,它会进入无限循环,为什么会发生这种情况以及那里正在进行什么操作??
  • @RaviTeja , 表示同一行代码中的多个操作。您编写了 2 个操作作为 if statement 的条件部分。在这种情况下,编译器应用操作之一。因此,我将其转换为机器级代码以确保应用了哪一个。从i &lt; 0, 5 开始应用5,因为C 编译器从左到右读取代码。而且,我在关于机器代码的回答中添加了更多解释。
【解决方案2】:

如果您希望循环在 5 次迭代后停止,您必须编写

for(i = 0;i<5;i++)
   printf("%d\n",i);

按照melpomene的建议,逗号操作解释为here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-08
    • 2011-08-13
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    相关资源
    最近更新 更多