我正在阅读 Charles Petzold 在 Programming Windows 中的一个程序。我被困在某一时刻。有一条线:
cxCaps=(tm.tmPitchAndFamily & 1?3:2)*cxChar/2;
其中cxCaps
(静态变量)保存大写字母的平均宽度
我的问题是什么& 1 ? 3 : 2
?
我知道它是条件运算符,但什么是 1 2 3。
谁能解释整cxCaps
条线?
我正在阅读 Charles Petzold 在 Programming Windows 中的一个程序。我被困在某一时刻。有一条线:
cxCaps=(tm.tmPitchAndFamily & 1?3:2)*cxChar/2;
其中cxCaps
(静态变量)保存大写字母的平均宽度
我的问题是什么& 1 ? 3 : 2
?
我知道它是条件运算符,但什么是 1 2 3。
谁能解释整cxCaps
条线?
这是一系列操作。让我们把它放在括号里:
((tm.tmPitchAndFamily & 1) ? 3 : 2) * (cxChar / 2);
所以首先tm.tmPitchAndFamily & 1
执行操作,检查是否tm.tmPitchAndFamily
为奇数(如果设置了最低有效位,则为奇数)。此操作的结果是三元表达式?:
的一部分。如果三元表达式的左侧非零(即真),则选择 的左侧:
,否则选择右侧。然后在乘法中使用该结果(即3
或)。2
cxCaps=(tm.tmPitchAndFamily & 1?3:2)*cxChar/2;
和
if (tm.tmPitchAndFamily & 1) {
cxCaps=3*cxChar/2;
} else {
cxCaps=2*cxChar/2;
}
是相同的
另一方面,&
是位运算符AND
在这种情况下意味着:
如果位1
设置在tm.tmPitchAndFamily
按位与 按位与运算符是一个 & 符号:&。一个方便的助记符是布尔 AND 的小版本 && 适用于较小的部分(位而不是字节、字符、整数等)。本质上,二进制 AND 只是将二进制形式的数字的每个位置中的位进行逻辑与。
例如,使用字节(char 类型):
01001000 & 10111000 = -------- 00001000
第一个数的最高位是 0,所以我们知道结果的最高位必须是 0;在第二个最高有效位中,第二个数字的位为零,所以我们有相同的结果。唯一一次两位都是 1,也就是唯一一次结果为 1,是从左数第五位。最后,
72 & 184 = 8
该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
正在那里使用。只有该陈述的上下文才能告诉您作者为何做出这些设计选择。