for(i = 0; i <10000000000; ++ i)编译为无限循环吗?

达博

我正在运行一些测试,以了解++ i和i ++如何转换为asm。我写了一个简单的:

int main()
{
    int i;
    for(i=0;i<1000000;++i);
    return 0;
}  

gcc test.c -O0 -o test编译它,并用objdump -d test检查asm

4004ed: 48 89 e5                mov    %rsp,%rbp
4004f0: c7 45 fc 00 00 00 00    movl   $0x0,-0x4(%rbp)  // i=0;
4004f7: eb 04                   jmp    4004fd <main+0x11>
4004f9: 83 45 fc 01             addl   $0x1,-0x4(%rbp)     // ++i;
4004fd: 81 7d fc 3f 42 0f 00    cmpl   $0xf423f,-0x4(%rbp) // 
400504: 7e f3                   jle    4004f9 <main+0xd>   //i<1000000;
400506: b8 00 00 00 00          mov    $0x0,%eax
40050b: 5d                      pop    %rbp
40050c: c3                      retq 

到目前为止,一切都很好。奇怪的是(如果我正确理解了asm代码)是什么时候而不是i <1000000我写了i <10000000000。循环条件与i <10000000000的停止条件完全相同,转换为以下汇编代码:

4004ed: 48 89 e5                mov    %rsp,%rbp
4004f0: c7 45 fc 00 00 00 00    movl   $0x0,-0x4(%rbp)
4004f7: 83 45 fc 01             addl   $0x1,-0x4(%rbp)
4004fb: eb fa                   jmp    4004f7 <main+0xb>

根据我的理解,这是一个无休止的循环,原因是:

 for(i=0;;++i);

问题是,是否真的有可能将其编译为无限循环?为什么?我正在使用Ubuntu 13.04,x86_64。

谢谢。

Nikos C.

发生这种情况的原因是int,架构上的最大值无法达到10000000000。在达到该值之前,它会在某个时间点溢出。因此,条件i < 10000000000将始终评估为true,这意味着这是一个无限循环。

编译器能够在编译时进行推断,这就是为什么它为无限循环生成适当的汇编的原因。

编译器可以就此警告您。为此,您可以使用以下命令启用“额外”警告级别:

gcc -Wextra

例如,GCC 4.8.2会告诉您:

warning: comparison is always true due to limited range of data type [-Wtype-limits]
for (i = 0; i < 10000000000; ++i);
^

而且,它甚至还告诉您特定的警告选项,它可以精确控制这种警告类型(Wtype-limits)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java的新手:10000000000中的i和j之间的位是什么

来自分类Dev

不放 (var i = 0) 导致无限循环

来自分类Dev

性能:if(i == 0)与if(!i)

来自分类Dev

Why i += i + i++ equals 0?

来自分类Dev

为什么i + = i + i ++等于0?

来自分类Dev

说明可选的PHP For循环语法:for($ i = 1,$ j = 0; $ i <= 10; $ j + = $ i,print $ i,$ i ++);

来自分类Dev

该代码的含义:for(i = 0; argv [1] [i]!='\ 0'; i ++)

来自分类常见问题

i的值(i == -i && i!= 0)在Java中返回true

来自分类Dev

C:对于(i = 0; i <= N; i ++){t [i] = pow(a,0.i); }总是返回1

来自分类Dev

为什么我+ = i + i ++等于0?

来自分类Dev

在C ++中,最好i> -1或i> = 0

来自分类Dev

这个“ for”循环会停止吗,为什么/为什么不呢?为(int i = 1; 1 / i> 0; i ++){}

来自分类Dev

for (let i in string) {} 等价于 for (let i = 0; i < string.length; i++) {} 吗?

来自分类Dev

for(i = 0; i <5; x =(i ++,a ++))如何工作

来自分类Dev

for(i = 0; i <5; x =(i ++,a ++))如何工作

来自分类Dev

阅读语句“if (x[i][0])”。

来自分类Dev

VueJS 如何做这种“for”循环:for(i = 0; i < x; i++)

来自分类Dev

“ for”循环中的“ int i = 0”与“ int i(0)”(分配与初始化计数变量)

来自分类Dev

实际上,我可以将Orion Context Broker编译为i686体系结构吗?

来自分类Dev

某些值打印了我不想要的 i (i = 0; i < 10; i++) 的额外次数。在 C 中使用 for 循环时

来自分类Dev

for(i in array)和for(var i = 0; i <array.length; i ++)之间的区别

来自分类Dev

for(i in array)和for(var i = 0; i <array.length; i ++)之间的区别

来自分类Dev

**i= 0 then x[i]= even, i =1 then [i]=odd** 从汇编转换为 Java 编程

来自分类Dev

解释在C中for(i = 0; 1; i ++)做什么?

来自分类Dev

!(i%2)与(i%2 == 0)有什么区别?

来自分类Dev

C ++语法,i%k == l%k == 0和i%k == 0 && l%k == 0之间的差

来自分类Dev

嵌套循环的大O(int j = 0; j <i; j ++)

来自分类Dev

内循环从0到i的时间复杂度

来自分类Dev

为什么for(int i = 0; i + 9 <s.length(); i ++)比for(int i = 0; i <s.length()-9; i ++)要快得多

Related 相关文章

  1. 1

    Java的新手:10000000000中的i和j之间的位是什么

  2. 2

    不放 (var i = 0) 导致无限循环

  3. 3

    性能:if(i == 0)与if(!i)

  4. 4

    Why i += i + i++ equals 0?

  5. 5

    为什么i + = i + i ++等于0?

  6. 6

    说明可选的PHP For循环语法:for($ i = 1,$ j = 0; $ i <= 10; $ j + = $ i,print $ i,$ i ++);

  7. 7

    该代码的含义:for(i = 0; argv [1] [i]!='\ 0'; i ++)

  8. 8

    i的值(i == -i && i!= 0)在Java中返回true

  9. 9

    C:对于(i = 0; i <= N; i ++){t [i] = pow(a,0.i); }总是返回1

  10. 10

    为什么我+ = i + i ++等于0?

  11. 11

    在C ++中,最好i> -1或i> = 0

  12. 12

    这个“ for”循环会停止吗,为什么/为什么不呢?为(int i = 1; 1 / i> 0; i ++){}

  13. 13

    for (let i in string) {} 等价于 for (let i = 0; i < string.length; i++) {} 吗?

  14. 14

    for(i = 0; i <5; x =(i ++,a ++))如何工作

  15. 15

    for(i = 0; i <5; x =(i ++,a ++))如何工作

  16. 16

    阅读语句“if (x[i][0])”。

  17. 17

    VueJS 如何做这种“for”循环:for(i = 0; i < x; i++)

  18. 18

    “ for”循环中的“ int i = 0”与“ int i(0)”(分配与初始化计数变量)

  19. 19

    实际上,我可以将Orion Context Broker编译为i686体系结构吗?

  20. 20

    某些值打印了我不想要的 i (i = 0; i < 10; i++) 的额外次数。在 C 中使用 for 循环时

  21. 21

    for(i in array)和for(var i = 0; i <array.length; i ++)之间的区别

  22. 22

    for(i in array)和for(var i = 0; i <array.length; i ++)之间的区别

  23. 23

    **i= 0 then x[i]= even, i =1 then [i]=odd** 从汇编转换为 Java 编程

  24. 24

    解释在C中for(i = 0; 1; i ++)做什么?

  25. 25

    !(i%2)与(i%2 == 0)有什么区别?

  26. 26

    C ++语法,i%k == l%k == 0和i%k == 0 && l%k == 0之间的差

  27. 27

    嵌套循环的大O(int j = 0; j <i; j ++)

  28. 28

    内循环从0到i的时间复杂度

  29. 29

    为什么for(int i = 0; i + 9 <s.length(); i ++)比for(int i = 0; i <s.length()-9; i ++)要快得多

热门标签

归档