我正在读书
Programming.Windows.5th.Edition,Charles Petzold
当我在做图4-5时。 SYSMETS1.C,我遇到了以下代码:
cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;
并且书中有解释,
SYSMETS1还在静态变量cxCaps中保存大写字母的平均宽度。对于固定间距字体,cxCaps将等于cxChar。对于可变宽度字体,cxCaps设置为cxChar的150%。 TEXTMETRIC结构中tmPitchAndFamily字段的低位对于可变宽度字体为1,对于固定间距字体为0。 SYSMETS1使用该位从cxChar计算cxCaps。
既然cxCaps设置为cxChar的150%,我认为它应该是
cxCaps =(tm.tmPitchAndFamily& 1? 3.0 : 2.0 )* cxChar / 2;
你能帮我解释一下吗?谢谢!
答案 0 :(得分:2)
cxChar
和cxCaps
有哪些类型?如果cxChar
为float
或double
,则没有问题,因为乘法的结果将在除以2之前转换为该类型,结果将为1.0或1.5 。但是cxCaps
也应该是浮点类型,因此它可以保存浮点值。
修改强>
我检查了这本书的代码,发现它们都是int
。而且我发现不需要浮点变量
例如,假设cxCahr
为20.如果tm.tmPitchAndFamily & 1
导致1
,那么表达式将为
cxCaps = 3 * cxChar / 2;
和cxCaps
将为30
。如果结果为0,'cxCaps'将为'20'。一切都很好。如果cxChar是一个奇数,那么丢失的值将是0.5
,这很容易被忽略。
答案 1 :(得分:0)
它正在尝试计算整数结果,以像素表示。有效计算为(3 * cxChar) / 2
,而不是3 * (cxChar / 2)
。大概是后者让你停下来。
对于比例字体,它将向下舍入,但永远不会超过单个像素。这无关紧要,因为无论如何这个值只是一个猜测,实际宽度对于比例字体中的每个字形都是不同的。
对于可读性没有得分,你可以像这样重写:
bool proportional = tm.tmPitchAndFamily & TMPF_FIXED_PITCH;
if (proportional) cxCaps = (3 * cxChar) / 2;
else cxCaps = cxChar;
注意标志的名称是多少,也许是Petzold这样写的原因。