<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ū)別?

          共 2195字,需瀏覽 5分鐘

           ·

          2022-01-10 03:10


          這是「進擊的Coder」的第 551?篇技術分享作者:strongerHuang來源:嵌入式專欄

          閱讀本文大概需要 5 分鐘。



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


          要回答這個問題,其實你各自編寫一段?while(1) 和 for(;;)?的代碼,編譯對比一下代碼大小和匯編文件,你就大概知道了。


          while(1) 和 for(;;) 語法表達

          這里先說一下 while(1) 和 for(;;) 語法表達式。
          1.while 語法表達
          while( 表達式 ){  語句}

          其中:

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

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


          while 語句的語義是:計算表達式的值,當值為真(非0)時, 執(zhí)行循環(huán)體語句。其執(zhí)行過程可用下圖表示:4f190036c6457ed4db4e685ee8a0837d.webp
          2.for 語法表達
          for(表達式1; 表達式2; 表達式3) {  語句}

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

          1.先求解表達式1


          2.求解表達式2

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

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


          3.求解表達式3


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


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


          執(zhí)行過程可用下圖表示:39ce7da702368295b60c785baa3524d1.webp


          while(1) 和 for(;;) 異同點

          這里先說一下結論,然后再驗證驗證結論。
          1.相同點作用和效果都一樣:都是實現(xiàn)無限循環(huán)的功能。

          2.不同點while(1):其中括號里面是一個條件,程序會判斷真假。而括號里面的“1”永遠是一個“真值”。
          其中,每一次循環(huán),編譯器都要判斷常量 1 是不是等于零。
          for(;;):這兩個;;空語句,編譯器一般會優(yōu)化掉的,直接進入死循環(huán)。

          根據(jù)上面的描述,你可能會覺得:while(1) 比 for(;;) 要做更多事,匯編代碼更多,代碼量也更大。
          但事實是這樣嗎?下面驗證一下。

          驗證 while(1) 和 for(;;) 差異

          我們編寫分別兩個文件 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

          你會發(fā)現(xiàn),除了文件名不同,其余都相同。
          當然,這里額外說一下,不同代碼、不同編譯器,以及不同優(yōu)化等級,可能最終結果有所差異。d1467d34e9f9dc4d776829eef0d2d817.webp

          End

          崔慶才的新書《Python3網(wǎng)絡爬蟲開發(fā)實戰(zhàn)(第二版)》已經(jīng)正式上市了!書中詳細介紹了零基礎用 Python 開發(fā)爬蟲的各方面知識,同時相比第一版新增了 JavaScript 逆向、Android 逆向、異步爬蟲、深度學習、Kubernetes 相關內(nèi)容,?同時本書已經(jīng)獲得 Python 之父 Guido 的推薦,目前本書正在七折促銷中!

          內(nèi)容介紹:《Python3網(wǎng)絡爬蟲開發(fā)實戰(zhàn)(第二版)》內(nèi)容介紹


          ff413d1e7765206b95ad6928d76b0c2f.webp


          掃碼購買




          好文和朋友一起看~
          瀏覽 30
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  簧片大全免费观看视频了6666 | 亚洲人成电影在线播放 | 男人先锋资源网 | 五月婷婷丁香亚洲 | 中文字幕网av |