这段代码有什么区别?

时间:2016-02-21 13:24:07

标签: c

#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]);

不同?

是否与优先顺序有关?

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)由*强制转换为整数。

这里是table of the operator precedences