簡體   English   中英

C語言中的邏輯運算符

[英]Logical Operators in C

我在嘗試理解邏輯運算符在C中的工作時遇到了麻煩。我已經了解了位級運算符的工作原理,並且我也知道邏輯運算符將非零參數視為TRUE,將零參數視為FALSE。

但是說我們有0x65 && 0x55。 我不明白為什么以及該操作給出0x01的原因。

我試圖將其轉換為二進制文件,但無法弄清楚它是如何工作的

&&運算子:

如果左操作數和右操作數都不是0則求值為1否則為0

如果左操作數為0 ,則不評估右操作數,結果為0

0x65 && 0x55的計算結果為1

&&是邏輯AND (與&相對,后者是按位 AND )。 它只關心其操作數為零/非零值。 零被視為false ,而非零被視為true

在您的情況下,兩個操作數都不為零,因此將它們視為true ,結果也為true C表示true1 ,說明了操作的總體結果。

如果將操作更改為& ,則會得到按位運算。 0x65 & 0x55將為您提供0x45的結果。

&&是邏輯運算符,不是按位運算符。 0x65和0x55均為真,因此結果為真數字。 0x01是真實數字。

二進制表示僅在按位運算中起作用。 表達式0x65 & 0x55等於0x45

任何值為0的表達式均為false。 而且任何非零的表達式都是正確的。 因此0x65和0x55都是正確的。

0x65 && 0x55

=>正確&&正確=>正確

我試圖將其轉換為二進制

那可能會妨礙理解。 0x650x55的確切位模式與所需結果完全無關,重要的是它們都非零。 您可以a = (0x65 && 0x55)視為等同於以下內容:

if (0x65 != 0) goto condition_false;
if (0x55 != 0) goto condition_false;
a = 1;
goto condition_end;
condition_false:
a = 0;
condition_end:

給定的實現可能能夠比之更有效地發出代碼(盡管我已經看到發出的代碼很多,每個if ... goto都是程序集中的一個測試和分支)。 效率更高的代碼可能涉及一些位操作,以避免分支。 因此,在這個涉及常量的示例中,編譯器可能只發出a = 1;

但是, &&運算符的含義是條件執行。 例如,如果編寫f() && g()則可以保證當f返回假值時,不會調用g 如果有可能通過位旋轉獲得相同的結果,那么性能可能會有所提高。

C和C ++具有三個邏輯運算符 :邏輯非( ! ),邏輯與( && )和邏輯或( || )。 對於邏輯運算符, 0為false, 任何非零的值為true 真值表說明了每個邏輯運算符的工作方式(將true用作1 ):

p     q     p && q    p || q
=     =     ======    ======
1     1       1         1
1     0       0         1
0     1       0         1
0     0       0         0

真相表! 如下:

p    !p
=    ===
1     0
0     1

對於您的具體情況:

0x65 && 0x55

由於兩個操作數0x650x55評估為true則整個表達式的計算結果為true ,並由此擴展到1 ,它適用於c99的連接線程,但其他的答案解釋之前,如何適用c99為好。

C將大於零的值定義為“ True”。 由於0x65和0x55都與此條件匹配,結果也為True-在輸出時為1-或以十六進制表示為0x01。

為您的代碼編寫的另一種樣式是:

返回(0x65為true)和(0x55為true);

如您所說,邏輯運算符將非零參數視為

 (0x65 && 0x55) is equal as (0x65 > 0) && (0x55 > 0)

 0x65 > 0 get true and 0x55 > 0 get true as well

 So (0x65 && 0x55)  is equal true && true = 1

暫無
暫無

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

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