簡體   English   中英

為什么最后打印1?

[英]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恢復為1truetrue總是!= 0 ,而false == 0 )。

這是它恢復到1

&&表示邏輯AND ,而不是按位AND ,即 C 中的& 。所以您對-22的值進行邏輯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.

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