簡體   English   中英

C中while循環中的++i和i++

[英]++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++ > 0a將增加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;
}

關於這里發生的事情的一些觀察:

  1. 因為在第一個 while 循環開始時 - a值為0 - 不大於0 循環在開始時被跳過。 結果,第一個printf輸出0

  2. 在第二個while循環開始時,在評估循環控制條件之前; 循環控制變量b增加1 ,導致b的值變為1 大於0 為此,執行第二個循環。

  3. 在執行第二個循環時, b的值一直遞增1直到b的值溢出。 此時,程序遇到未定義的行為- 如果程序沒有崩潰或無限期地繼續執行循環(在這種情況下,操作系統將在某個階段終止程序;或要求用戶終止它),則退出while循環- 因為程序將變得無響應)。

您提到要測量int值的限制; 我希望這個參考這個參考能在某種程度上幫助你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM