[英]C Programming under Windows
我正在閱讀Charles Petzold的“ Windows編程”中的程序。 我被困在某一點。 有一條線:
cxCaps=(tm.tmPitchAndFamily & 1?3:2)*cxChar/2;
其中cxCaps
(靜態變量)保存大寫字母的平均寬度
我的問題是& 1 ? 3 : 2
& 1 ? 3 : 2
?
我知道它是條件運算符,但是1 2 3是什么。
誰能解釋整個cxCaps
系列?
這是一系列操作。 讓它放在括號中:
((tm.tmPitchAndFamily & 1) ? 3 : 2) * (cxChar / 2);
因此,首先執行tm.tmPitchAndFamily & 1
操作,該操作檢查tm.tmPitchAndFamily
是否為奇數(如果設置了最低有效位,則為奇數)。 然后,此操作的結果是三元表達式?:
。 如果三元表達式的左手邊非零(即true),則選擇:
的左手邊,否則選擇右手邊。 然后將其結果( 3
或2
)用於乘法。
cxCaps=(tm.tmPitchAndFamily & 1?3:2)*cxChar/2;
和
if (tm.tmPitchAndFamily & 1) {
cxCaps=3*cxChar/2;
} else {
cxCaps=2*cxChar/2;
}
是相同的
另一方面, &
是按位運算符AND
在這種情況下意味着:
如果在tm.tmPitchAndFamily
設置了位1
按位與運算符按位與運算符是單個&符:&。 一個方便的助記符是布爾AND和&&的較小版本可用於較小的塊(位而不是字節,字符,整數等)。 本質上,二進制“與”僅以二進制形式對數字的每個位置中的位進行邏輯“與”運算。
例如,使用字節(char類型):
01001000&10111000 = -------- 00001000
第一個數字的最高有效位是0,因此我們知道結果的最高有效位必須是0; 在第二個最高有效位中,第二個數字的位為零,因此我們得到相同的結果。 兩個位均為1的唯一時間(即結果唯一為1的時間)是從左數第五位。 所以,
72和184 = 8
a ? b : c
a ? b : c
構造是一個if表達式,表示:“如果a為真,則值為b;否則值為c”,例如:
int foo = 0 ? 1 : 2;
foo將是2
int foo = 1 ? 2 : 3;
foo將為1。
&
運算符是按位運算符,它將對值應用掩碼。
如果您在C中查看運算符優先級 ,則:?
三元if的優先級低於按位if。 它將檢查tm.tmPitchAndFamily
最后一位是否為真,從而檢查其值是否為奇數。 該值將用於乘法。
最后,我要說的是,表達式的編寫方式令人困惑,如果編寫如下,那會更好:
cxCaps=(tm.tmPitchAndFamily&1 ? 3 : 2)*cxChar/2;
最后,回答您的第一個問題:
我的問題是&1? 3:2? 我知道它是條件運算符,但是1 2 3是什么。
1
被用作測試以了解左手值是否為奇數 3
2
。 只有該陳述的上下文可以告訴您作者為何做出這些設計選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.