日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

while(1) 和 for(;;)它們不都是無限循環嗎,作用應該一樣啊,它們到底有什么區別?

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

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

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

1.while語法表達

while( 表達式 )
{
  語句
}

 

其中:

  • 表達式:是循環條件
  • 語句:為循環體。

while語句的語義是:計算表達式的值,當值為真(非0)時, 執行循環體語句。其執行過程可用下圖表示:

從匯編層告訴你while(1) 和 for(;;)有什么區別?

 

2.for語法表達

for(表達式1; 表達式2; 表達式3) 
{
  語句
}

 

它的執行過程如下:

 

1.先求解表達式1

2.求解表達式2

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

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

3.求解表達式3

4.轉回上面第2)步繼續執行。

5.循環結束,執行for語句下面的一個語句。

執行過程可用下圖表示:

從匯編層告訴你while(1) 和 for(;;)有什么區別?

 

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

 

這里先說一下結論,然后再驗證驗證結論。

 

1.相同點

 

作用和效果都一樣:都是實現無限循環的功能。

 

2.不同點

 

while(1):其中括號里面是一個條件,程序會判斷真假。而括號里面的“1”永遠是一個“真值”。

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

for(;;):這兩個;;空語句,編譯器一般會優化掉的,直接進入死循環。

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

但事實是這樣嗎?下面驗證一下。

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

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

1.源代碼

while.c:

// filename: while.c
int main(int argc, char const *argv[])
{
    while(1)
    {}




    return 0;
}

for.c:

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




    return 0;
}

 

2.生成匯編

 

我們這里使用gcc編譯器生成匯編,執行命令如下:

gcc -S -o while.s while.c
gcc -S -o for.s for.c

 

while匯編代碼:

; filename: whiles
  .file  "while.c"
  .text
  .globl  main
  .type  main, @function
main:
.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, @function
main:
.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

 

你會發現,除了文件名不同,其余都相同。

當然,這里額外說一下,不同代碼、不同編譯器,以及不同優化等級,可能最終結果有所差異。

分享到:
標簽:匯編
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定