0

我正在阅读 Charles Petzold 在 Programming Windows 中的一个程序。我被困在某一时刻。有一条线:

cxCaps=(tm.tmPitchAndFamily & 1?3:2)*cxChar/2;

其中cxCaps(静态变量)保存大写字母的平均宽度

我的问题是什么& 1 ? 3 : 2

我知道它是条件运算符,但什么是 1 2 3。

谁能解释整cxCaps条线?

4

3 回答 3

4

这是一系列操作。让我们把它放在括号里:

((tm.tmPitchAndFamily & 1) ? 3 : 2) * (cxChar / 2);

所以首先tm.tmPitchAndFamily & 1执行操作,检查是否tm.tmPitchAndFamily为奇数(如果设置了最低有效位,则为奇数)。此操作的结果是三元表达式?:的一部分。如果三元表达式的左侧非零(即真),则选择 的左侧:,否则选择右侧。然后在乘法中使用该结果(即3或)。2

于 2013-06-22T17:45:39.817 回答
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

于 2013-06-22T17:43:27.377 回答
2

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正在那里使用。

只有该陈述的上下文才能告诉您作者为何做出这些设计选择。

于 2013-06-22T17:46:43.910 回答