[英]++i and i++ in while loop in C
我正在使用一個程序來檢測每個數據類型的邊界,它是這樣的:
#include <stdio.h>
#include <stdlib.h>
int main()
{
/*first while loop using a++ dosesn't give us a right answer*/
int a = 0;
while (a++ > 0);
printf("int max first = %d\n", a-1);
/*second while loop using ++a performs well*/
int b = 0;
while (++b > 0);
printf("int max second = %d\n", b-1);
system("pause");
return 0;
}
在我編譯這個 propram 並執行它之后,它返回:
int max first = 0
int max second = 2147483647
於是我調試了一下,發現在第一部分, a++
變為1
,它只是停止自增並跳轉while
循環,而在第二部分它運行良好,為什么會發生這種情況?
預增量操作者(例如++b
)首先進行,和表達的值是增加后的值。
那是
int b = 0;
while (++b > 0) ...
將首先增加b
,然后使用大於比較檢查其值。 由於在第一次迭代++b
將使b
等於1
因此條件將是1 > 0
,這是真的。
現在后增量運算符在使用舊值后進行增量。
因此,例如, a++
將返回舊值a
,然后做增量。
所以與
int a = 0;
while (a++ > 0) ...
第一次迭代a++
將返回0
,這意味着您的條件0 > 0
為假,並且循環甚至永遠不會迭代一次。 但價值a
仍然會增加,所以后來就等於1
(當循環已經結束)。
前運算符和后運算符的這種行為應該是任何像樣的書籍、教程或課程的一部分。
在 a++ 變為 1 后,它只是停止自動遞增並跳轉 while 循環
發生這種情況是因為 post 和 pre 增量運算符以及;
在while
循環中一起工作。
a
評估條件a++ > 0
后, a
將增加1
。 因此,條件不成立。 ;
在while
語句的末尾會導致一個空循環,即使while
循環所基於的條件返回 true,也將執行下一個打印語句。
這正是第二個while
循環中發生的情況 - 在while (++b > 0);
內部檢查條件之前,預增量運算符將增加b
while (++b > 0);
. 空的while
循環不斷地給b
的值加 1,直到出現溢出。
此時,嚴格來說,您調用了未定義的行為,因為該操作導致有符號整數溢出。
讓我重寫您編寫的main
函數 - 使其更容易理解。
int main()
{
/*first while loop*/
int a = 0;
while (a > 0){ a = a + 1; }
printf("int max first = %d\n", a-1);
/*second while loop*/
int b = 0;
b = b + 1;
while (b > 0){ b = b + 1; }
printf("int max second = %d\n", b-1);
system("pause");
return 0;
}
關於這里發生的事情的一些觀察:
因為在第一個 while 循環開始時 - a
值為0
- 不大於0
; 循環在開始時被跳過。 結果,第一個printf
輸出0
。
在第二個while循環開始時,在評估循環控制條件之前; 循環控制變量b
增加1
,導致b
的值變為1
; 大於0
。 為此,執行第二個循環。
在執行第二個循環時, b
的值一直遞增1
直到b
的值溢出。 此時,程序遇到未定義的行為- 如果程序沒有崩潰或無限期地繼續執行循環(在這種情況下,操作系統將在某個階段終止程序;或要求用戶終止它),則退出while
循環- 因為程序將變得無響應)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.