[英]Why does it print 1 at the end?
我不明白為什么它最后會打印 1。
#include <stdio.h>
int main(){
printf("%d\n", -2&&2);
return 0;
}
&&
是布爾運算符,而不是整數運算符。 在 C 中,任何非零值在應用於布爾運算時都被解釋為true
,而零是應用於布爾運算時唯一被視為false
整數值。
所以:
(<non-zero> && <non-zero>) == true
然后相反,當true
結果被視為整數時(如本例中的%d
格式說明符所指示), true
由 1 表示,而false
為零。 所以在這種情況下true
變為 1。
如果要打印布爾結果,則:
printf( "%s\n", (-2 && 2) == 0 ? "false" : "true" ) ;
嚴格的表達:
-2 && 2
相當於:
(-2 != 0) && (2 != 0)
由於!=
具有來自整數操作數的布爾結果,因此具有嚴格的類型協議,因此&&
僅以布爾操作數呈現,沒有隱式轉換。
因為-2&&2
的計算結果為true
= 1(當您將兩個數字 AND 在一起時,除非其中一個或兩個數字為 0,否則您將得到 true)。 嘗試將-2&&2
更改為true && false
; 它會打印 0。
基於布爾算術運算,表達式-2&&2
恢復為1
或true
( true
總是!= 0
,而false == 0
)。
這是它恢復到1
:
&&
表示邏輯AND
,而不是按位AND
,即 C 中的&
。所以您對-2
和2
的值進行邏輯AND
運算。
讓我們將以下句子視為邏輯與 ( &&
) 運算的語句之一:
如果兩個操作數都不為零,則條件為真。
-2
非零,等於1
。
2
也是非零的,等於1
。
所以結果也是1
( 1
AND 1
= 1
) 或true
代表1
。
&&
運算符用於邏輯與,而不是按位與。
程序中的表達式計算為
printf("%d\n", (-2 != 0) && (2 != 0));
這是1
因為布爾表達式在 C 中的值為0
表示假,值為1
表示真。
相反,如果您編寫了-2 & 2
,則您的程序將具有實現定義的行為,具體取決於用於目標系統的負整數的表示。 在具有二進制補碼表示的現代系統上,此按位和表達式的計算結果為2
。 符號幅度表示的相同值,但在具有補碼表示的罕見系統上,該值將為0
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.