簡體   English   中英

與后遞增和邏輯運算符混淆?

[英]Confusion with post increment and logical operator?

    #include <stdio.h>
    #include <string.h>

    main()
    {
         int i=-1, j=-1, k=0, l=2,m;
         m = i++&&j++&&k++||l++;
         printf("%d%d%d%d%d", i, j, k, l, m);
    }

輸出:

00131

我很困惑表達式如何被求值。

這里真正重要的是|| 由於l++計算結果為布爾值1 (true),因此整個語句為true。 所以m為1,其余的只是它們的原始值加上一個值,它們在求值后就增加了。

您正在評估布爾表達式:

((-1 && -1) && 0) || 2

順便說一句,您對main的定義應為:

int main(void)

我想您的問題是實際上將發生哪些增量。

&&和|| (邏輯和與邏輯或)是“短路”操作。 他們僅評估他們足夠多的論據來確定它們是對還是錯。 有效地,可以將x && y視為x ? y : 0 x ? y : 0x || y x || y可以視為x ? 1 : y x ? 1 : y

&&優先於||,因此從i++ && j++ && k++ 首先評估i++ ,返回-1並將i設置為0 由於返回的值是true(非零),因此我們繼續評估j++ ,它再次返回-1 (true)並將j遞增為0。我們仍然沒有證明&&的值,因此我們評估k++ ,它返回0 (假),將k遞增為1。該假給出了最終的和假值。

現在我們進入||。 實際上,您現在有false || l++ false || l++ false不足以確定or的結果,因此我們評估l++ 在將l設置為3返回2 (true)。 真實值迫使||的值 以及表達式的最終值是true

請注意,如果ijk以0(假)開始,則以后的增量將不會發生,因為短路評估會確定不需要它們來產生結果。 通常,混合&&|| 正是由於這個原因,帶有副作用的想法是一個壞主意 -它產生了不必要理解的邏輯。 ?:版本-或真實的if/then/else語句-將使這種交互更加清晰。 您應該了解如何閱讀這種混亂的情況,因為您將在其他程序員的C代碼中遇到它-但幾乎永遠不要編寫它。 而且,如果必須,則應將其記錄在案。 您節省的理智可能是您自己的。

使用以下規則:

i ++ =后增加i的值,k ++ =后增加k的值,l ++ =后增加l的值,j ++ =后增加j的值

&&-如果比較的值均非零,則為true(1),否則為false(0)

|| -如果比較的值均為零,則為false(0),否則為true(1)

然后應用於表達式m(也可以在c中讀取運算符優先級)

暫無
暫無

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

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