<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          while(1) 和 for(;;)有什么區(qū)別?

          共 2360字,需瀏覽 5分鐘

           ·

          2022-01-03 07:25

          1、使用MySQL,請(qǐng)用好 JSON 這張牌!

          2、延時(shí)任務(wù)實(shí)現(xiàn)方案

          3、服務(wù)端如何防止重復(fù)支付

          4、五年工作經(jīng)驗(yàn)總結(jié) 16 條的代碼規(guī)范

          5、突發(fā)!Apache Log4j2 報(bào)核彈級(jí)漏洞

          作者 |?strongerHuang

          微信公眾號(hào) |?嵌入式專(zhuān)

          有讀者問(wèn)題了類(lèi)似這樣的問(wèn)題:while(1) 和 for(;;)它們不都是無(wú)限循環(huán)嗎,作用應(yīng)該一樣啊,它們到底有什么區(qū)別?


          要回答這個(gè)問(wèn)題,其實(shí)你各自編寫(xiě)一段while(1) 和 for(;;)的代碼,編譯對(duì)比一下代碼大小和匯編文件,你就大概知道了。


          while(1)和for(;;)語(yǔ)法表達(dá)

          這里先說(shuō)一下while(1)和for(;;)語(yǔ)法表達(dá)式。

          1.while語(yǔ)法表達(dá)
          while( 表達(dá)式 ){  語(yǔ)句}

          其中:

          • 表達(dá)式:是循環(huán)條件

          • 語(yǔ)句:為循環(huán)體。


          while語(yǔ)句的語(yǔ)義是:計(jì)算表達(dá)式的值,當(dāng)值為真(非0)時(shí), 執(zhí)行循環(huán)體語(yǔ)句。其執(zhí)行過(guò)程可用下圖表示:

          2.for語(yǔ)法表達(dá)
          for(表達(dá)式1; 表達(dá)式2; 表達(dá)式3) {  語(yǔ)句}

          它的執(zhí)行過(guò)程如下:

          1.先求解表達(dá)式1


          2.求解表達(dá)式2

          若其值為真(非0),則執(zhí)行for語(yǔ)句中指定的內(nèi)嵌語(yǔ)句,然后執(zhí)行下面第3)步;

          若其值為假(0),則結(jié)束循環(huán),轉(zhuǎn)到第5)步。


          3.求解表達(dá)式3


          4.轉(zhuǎn)回上面第2)步繼續(xù)執(zhí)行。


          5.循環(huán)結(jié)束,執(zhí)行for語(yǔ)句下面的一個(gè)語(yǔ)句。


          執(zhí)行過(guò)程可用下圖表示:


          while(1)和for(;;)異同點(diǎn)

          這里先說(shuō)一下結(jié)論,然后再驗(yàn)證驗(yàn)證結(jié)論。

          1.相同點(diǎn)
          作用和效果都一樣:都是實(shí)現(xiàn)無(wú)限循環(huán)的功能。

          2.不同點(diǎn)
          while(1):其中括號(hào)里面是一個(gè)條件,程序會(huì)判斷真假。而括號(hào)里面的“1”永遠(yuǎn)是一個(gè)“真值”。

          其中,每一次循環(huán),編譯器都要判斷常量1是不是等于零。

          for(;;):這兩個(gè);;空語(yǔ)句,編譯器一般會(huì)優(yōu)化掉的,直接進(jìn)入死循環(huán)。

          根據(jù)上面的描述,你可能會(huì)覺(jué)得:while(1) 比 for(;;) 要做更多事,匯編代碼更多,代碼量也更大。

          但事實(shí)是這樣嗎?下面驗(yàn)證一下。

          驗(yàn)證while(1)和for(;;)差異

          我們編寫(xiě)分別兩個(gè)文件for.c和while.c,然后分別生成匯編代碼,看下情況。

          1.源代碼
          while.c
          // filename: while.cint main(int argc, char const *argv[]){while(1)    {}
          return 0;}

          for.c
          // filename: for.cint main(int argc, char const *argv[]){for(;;)    {}
          return 0;}

          2.生成匯編
          我們這里使用gcc編譯器生成匯編,執(zhí)行命令如下:
          gcc -S -o while.s while.cgcc -S -o for.s for.c

          while匯編代碼:
          ; filename: whiles  .file  "while.c"  .text  .globl  main  .type  main, @functionmain:.LFB0:  .cfi_startproc  pushq  %rbp  .cfi_def_cfa_offset 16  .cfi_offset 6, -16  movq  %rsp, %rbp  .cfi_def_cfa_register 6  movl  %edi, -4(%rbp)  movq  %rsi, -16(%rbp).L2:  jmp  .L2  .cfi_endproc.LFE0:  .size  main, .-main  .ident  "GCC: (GNU) 9.3.0"  .section  .note.GNU-stack,"",@progbits

          for匯編代碼:
          ; filename: for.s  .file  "for.c"  .text  .globl  main  .type  main, @functionmain:.LFB0:  .cfi_startproc  pushq  %rbp  .cfi_def_cfa_offset 16  .cfi_offset 6, -16  movq  %rsp, %rbp  .cfi_def_cfa_register 6  movl  %edi, -4(%rbp)  movq  %rsi, -16(%rbp).L2:  jmp  .L2  .cfi_endproc.LFE0:  .size  main, .-main  .ident  "GCC: (GNU) 9.3.0"  .section  .note.GNU-stack,"",@progbits

          你會(huì)發(fā)現(xiàn),除了文件名不同,其余都相同。

          當(dāng)然,這里額外說(shuō)一下,不同代碼、不同編譯器,以及不同優(yōu)化等級(jí),可能最終結(jié)果有所差異。

          最近熱文閱讀:

          1、使用MySQL,請(qǐng)用好 JSON 這張牌!
          2、延時(shí)任務(wù)實(shí)現(xiàn)方案
          3、服務(wù)端如何防止重復(fù)支付
          4、五年工作經(jīng)驗(yàn)總結(jié) 16 條的代碼規(guī)范
          5、為什么我勸你放棄了Restful API?
          6、Java8 Stream:2萬(wàn)字20個(gè)實(shí)例,玩轉(zhuǎn)集合的篩選、歸約、分組、聚合
          7、公司規(guī)定所有接口都用 POST請(qǐng)求,這是為什么?
          8、為什么阿里強(qiáng)制 boolean 類(lèi)型變量不能使用 is 開(kāi)頭?
          9、面試官:InnoDB中一棵B+樹(shù)可以存放多少行數(shù)據(jù)?
          10、MyBatis批量插入幾千條數(shù)據(jù),請(qǐng)慎用foreach
          關(guān)注公眾號(hào),你想要的Java都在這里

          瀏覽 29
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人精品午夜无码免费 | 免费高清无码在线观看 | 大香蕉伊人视频在线观看 | 亚洲成人无码精品 | 久热RE让视频在线观看 |