这段代码有什么区别?

mat*_*com 2 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;
}
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,此代码的结果为0:250,但如果我省略这样的括号,

printf("%d  : \t%d \n", i, (int)nFee*aRate[2]);
Run Code Online (Sandbox Code Playgroud)

那么结果是0:0.

为什么是

printf("%d  : \t%d \n", i, (int)(nFee*aRate[2]));
Run Code Online (Sandbox Code Playgroud)

printf("%d  : \t%d \n", i, (int)nFee*aRate[2]);
Run Code Online (Sandbox Code Playgroud)

不同?

它与优先顺序有关吗?

Jab*_*cky 8

类型(int)nFee*aRate[2]double,因为它((int)nFee)*aRate[2]运算符优先级相同,并且a double和a的乘法结果int被提升为double.因此,您使用的%d格式说明符用于double产生未定义的行为.

该类型(int)(nFee*aRate[2])int因此%d作为格式说明是正确的,你会得到250(0.25*1000)的exepected结果.