成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 后端
有讀者問題了類似這樣的問題:while(1) 和 for(;;)它們不都是無限循環嗎,作用應該一樣啊,它們到底有什么區別?來看一下吧。

 [[441014]]

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

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

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

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

1.while語法表達 

  1. while( 表達式 )  
  2.  
  3.   語句  

其中:

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

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

 

2.for語法表達 

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

它的執行過程如下:

    1.先求解表達式1

    2.求解表達式2

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

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

    3.求解表達式3

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

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

執行過程可用下圖表示:

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

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

1.相同點

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

2.不同點

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

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

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

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

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

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

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

1.源代碼

while.c: 

  1. // filename: while.c  
  2. int main(int argc, char const *argv[])  
  3.  
  4.     while(1) 
  5.     {}  
  6.     return 0;  

for.c: 

  1. // filename: for.c  
  2. int main(int argc, char const *argv[])  
  3.  
  4.     for(;;)  
  5.     {}  
  6.     return 0;  

2.生成匯編

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

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

while匯編代碼: 

  1. ; filename: whiles  
  2.   .file  "while.c"  
  3.   .text  
  4.   .globl  main  
  5.   .type  main, @function  
  6. main:  
  7. .LFB0:  
  8.   .cfi_startproc  
  9.   pushq  %rbp  
  10.   .cfi_def_cfa_offset 16  
  11.   .cfi_offset 6, -16  
  12.   movq  %rsp, %rbp  
  13.   .cfi_def_cfa_register 6  
  14.   movl  %edi, -4(%rbp)  
  15.   movq  %rsi, -16(%rbp)  
  16. .L2:  
  17.   jmp  .L2  
  18.   .cfi_endproc  
  19. .LFE0:  
  20.   .size  main, .-main  
  21.   .ident  "GCC: (GNU) 9.3.0"  
  22.   .section  .note.GNU-stack,"",@progbits 

for匯編代碼: 

  1. ; filename: for.s  
  2.   .file  "for.c"  
  3.   .text  
  4.   .globl  main  
  5.   .type  main, @function  
  6. main:  
  7. .LFB0:  
  8.   .cfi_startproc  
  9.   pushq  %rbp  
  10.   .cfi_def_cfa_offset 16  
  11.   .cfi_offset 6, -16  
  12.   movq  %rsp, %rbp  
  13.   .cfi_def_cfa_register 6  
  14.   movl  %edi, -4(%rbp)  
  15.   movq  %rsi, -16(%rbp)  
  16. .L2:  
  17.   jmp  .L2  
  18.   .cfi_endproc  
  19. .LFE0:  
  20.   .size  main, .-main  
  21.   .ident  "GCC: (GNU) 9.3.0"  
  22.   .section  .note.GNU-stack,"",@progbits 

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

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

 

責任編輯:龐桂玉 來源: C語言與C++編程
相關推薦

2020-03-09 20:56:19

LoRaLoRaWAN無線技術

2022-09-07 18:32:57

并發編程線程

2022-09-08 18:38:26

LinuxWindowsmacOS

2020-11-09 14:07:53

PyQtQt編程

2022-06-06 14:53:02

LoRaLoRaWAN

2024-05-27 00:40:00

2022-02-27 15:33:22

安全CASBSASE

2021-05-16 14:26:08

RPAIPACIO

2024-03-05 18:59:59

前端開發localhost

2024-09-09 13:10:14

2022-08-02 08:23:37

SessionCookies

2021-05-31 15:53:30

Cat-M1NB-IoT物聯網

2023-12-15 09:21:17

ObjectJavaString

2022-08-31 08:33:54

Bash操作系統Linux

2025-03-10 09:30:00

SpringJava開發

2022-08-22 07:06:32

MyBatisSQL占位符

2022-01-16 07:46:53

SpringDataASSM

2022-08-03 07:04:56

GETHTTPPOST

2021-03-27 10:56:17

promisethenfinally

2023-01-19 17:51:19

apt removeapt purge
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品一区二区三区四区 | 综合久久99 | www.国产91| 中文字幕视频在线观看 | 国产精品成人一区 | 超碰国产在线 | 日日操av | 日韩视频精品在线 | 一区二区在线 | 中文字幕一区二区三区乱码图片 | 久久性| 欧美三级网站 | 九九九久久国产免费 | 久草网站 | 久久精品69 | 日韩在线观看网站 | 日韩av成人| 99精品国自产在线 | 国产精品免费一区二区三区 | 99re国产视频| 狠狠干在线 | 亚洲国产中文字幕 | 精品国产区 | 日韩成人在线观看 | 美美女高清毛片视频免费观看 | 亚洲精品一区中文字幕乱码 | 91精品国产91久久久久久 | 亚洲一区二区视频 | 丁香一区二区 | 在线亚洲免费 | 精品成人免费视频 | 岛国毛片在线观看 | 欧美亚洲国产一区二区三区 | 一级黄色录像片子 | 伊人伊人伊人 | 国产电影一区二区 | 日韩高清黄色 | 国产色视频网站 | 性做久久久久久免费观看欧美 | 久久激情av | 欧美色a v |