zoukankan      html  css  js  c++  java
  • for(;;)和 while(1) 有什么区别吗?for()和while()的使用情景。

    for(;;)和 while(1) 有什么区别吗?

    void main(void)
    {
        int a = 2 ;
        // for(;;)
         while(1)
        {
            a++;
        }
    }
    arm-linux-gcc -c -o for.o for.c;
    arm-linux-ld -o for_elf for.o;
    arm-linux-objcopy -O binary -S for_elf for.bin;
    arm-linux-objdump -D -m arm for_elf > for.dis;
    cat for.dis

    00008460 <main>: //for(;;);
    8460: e1a0c00d mov ip, sp
    8464: e92dd800 stmdb sp!, {fp, ip, lr, pc}
    8468: e24cb004 sub fp, ip, #4 ; 0x4
    846c: eafffffe b 846c <main+0xc>


    00008074 <main>://while(1);
    8074: e1a0c00d mov ip, sp
    8078: e92dd800 stmdb sp!, {fp, ip, lr, pc}
    807c: e24cb004 sub fp, ip, #4 ; 0x4
    8080: eafffffe b

    没发现区别所在。


    00008074 <main>://while(1){a++}
    8074: e1a0c00d mov ip, sp
    8078: e92dd800 stmdb sp!, {fp, ip, lr, pc}
    807c: e24cb004 sub fp, ip, #4 ; 0x4
    8080: e24dd004 sub sp, sp, #4 ; 0x4
    8084: e3a03002 mov r3, #2 ; 0x2
    8088: e50b3010 str r3, [fp, #-16]
    808c: e51b3010 ldr r3, [fp, #-16]
    8090: e2833001 add r3, r3, #1 ; 0x1
    8094: e50b3010 str r3, [fp, #-16]
    8098: eafffffb b 808c <main+0x18>

    00008074 <main>://for(;;){a++}
    8074: e1a0c00d mov ip, sp
    8078: e92dd800 stmdb sp!, {fp, ip, lr, pc}
    807c: e24cb004 sub fp, ip, #4 ; 0x4
    8080: e24dd004 sub sp, sp, #4 ; 0x4
    8084: e3a03002 mov r3, #2 ; 0x2
    8088: e50b3010 str r3, [fp, #-16]
    808c: e51b3010 ldr r3, [fp, #-16]
    8090: e2833001 add r3, r3, #1 ; 0x1
    8094: e50b3010 str r3, [fp, #-16]
    8098: eafffffb b 808c <main+0x18>

    2 为什么用for(;;)或者while(1)

    详细阅读http://bbs.csdn.net/topics/80195701中下面一段话后面的内容:

    《代码大全》里面说:
        在C 中,只要允许就用for 循环: C 的for 循环是这种语言强有力的结构之一。它不仅
    活性强,而且把循环控制代码封装在一起,增加了其可读性。程序员在修改软件时易犯的错误
    是;修改了循环前面的初始化循环的代码,但却忘了修改其后面的有关代码。在C 的for 循环
    中,所有相关代码集中在循环的顶部,修改起来很容易。如果在C 中能用for 循环替代别的类
    型的循环,尽量这样做。


    但当while 循环更合适时,别用for 循环。

    这个C 中程序虽是for循环却用了while循环的条件头: 
     
    /* read all the records from a file */
    for(rewind(InFile).RecCount = 0; !feof(InFile); RecCount++)
    {
    fgets(InputRec[RecCount], MAX_CHARS, InFile);
    }
     
        C 语言的for 循环比其它语言的for 循环优点在于,它的初始化和结束条件很灵活,而这
    种灵活性带来的固有缺点是把控制条件放在了循环头,因而对循环体就无法控制了。 
        把控制循环的语句放到for 循环头如初始化循环变量、终止循环或转向终止的表达式。上
    例中,fgets()语句使循环转向中止,但RecCount 语句却没起到这个作用,它是内部语句,
    没有起到控制循环的作用。把RecCount 语句放在循环头而把fgets()语句放在循环体中是一
    个错误,它使人误解为是RecCount在控制循环。
    这个C 程序较好地用了while循环: 
     
        /* read all the records from a file */
    rewind(InFile);
    RecCount = 0;
    while(!feof(InFile))
    {
    fgets(InputRec[RecCount], MAX_CHARS, InFile);
    RecCount++;
    }
  • 相关阅读:
    python之路---23 模块 os sys pickle json
    Fiddler抓包【7】_次要功能和第三方插件
    Fiddler抓包【6】_Fiddler Script
    Fiddler抓包【5】_Fiddler过滤
    Fiddler抓包【4】_重定向AutoResponder
    Fiddler抓包【3】_设置断点修改
    Fiddler抓包【2】_捕获设置
    Fiddler抓包【1】_介绍及界面概述
    CSS常见兼容问题以及解决办法
    webpack入门文档教程
  • 原文地址:https://www.cnblogs.com/mylinux/p/3978591.html
Copyright © 2011-2022 走看看