[英]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表示true
為1
,說明了操作的總體結果。
如果將操作更改為&
,則會得到按位運算。 0x65 & 0x55
將為您提供0x45
的結果。
&&
是邏輯運算符,不是按位運算符。 0x65和0x55均為真,因此結果為真數字。 0x01是真實數字。
二進制表示僅在按位運算中起作用。 表達式0x65 & 0x55
等於0x45
。
任何值為0的表達式均為false。 而且任何非零的表達式都是正確的。 因此0x65和0x55都是正確的。
0x65 && 0x55
=>正確&&正確=>正確
我試圖將其轉換為二進制
那可能會妨礙理解。 0x65
和0x55
的確切位模式與所需結果完全無關,重要的是它們都非零。 您可以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
由於兩個操作數0x65
和0x55
評估為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.