簡體   English   中英

Windows下的C編程

[英]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),則選擇:的左手邊,否則選擇右手邊。 然后將其結果( 32 )用於乘法。

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.

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