[英]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 : 0
和x || 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
。
請注意,如果i
, j
或k
以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.