#include <stdio.h>
int main(void)
{
double aRate[10] = { 0.0, 0.1, 0.25, 0.5, 0.5, 0.6, 0.65, 0.8, 0.82, 0.97};
int nAge = 0, i = 0, nFee = 1000;
int a = 0;
printf("%d : \t%d \n", i, (int)(nFee*aRate[2]));
return 0;
}
此代码的结果为0:250,如预期的那样,但如果省略这样的括号,
printf("%d : \t%d \n", i, (int)nFee*aRate[2]);
然后结果是0:0。
为什么
printf("%d : \t%d \n", i, (int)(nFee*aRate[2]));
和
printf("%d : \t%d \n", i, (int)nFee*aRate[2]);
不同?
是否与优先顺序有关?
答案 0 :(得分:8)
(int)nFee*aRate[2]
的类型为double
,因为它与((int)nFee)*aRate[2]
相同,因为operator precedence和{{1}的乘法结果并且double
被提升为int
。因此,您使用double
作为%d
的格式说明符,这会产生未定义的行为。
double
的类型为(int)(nFee*aRate[2])
,因此int
格式说明符正确,您得到的结果为250(0.25 * 1000)。
答案 1 :(得分:1)
是的,它与括号有关。 LocalBroadcastManager
绑定非常紧密,所以在第二个例子中它将nFee转换为整数,这有点无意义,因为它已经是一个整数。 LocalBroadcastManager
然后乘以int和double,产生double。
在第一个示例中,带括号的表达式(int)
(类型为double)由*
强制转换为整数。