使用的编译器是AIX的CC。下面的代码显示了之前和之后的差异。
$cat tst1.c
#include <stdio.h>
#include <math.h>
int main()
{
int val1=nearest((double)(1.5)),val2=nearest((double)(2.5)),val3=nearest((double)(2.6));
/*Before*/
printf("nearest 1.5 ==> %d\n",val1);
printf("nearest 2.5 ==> %d\n",val2);
printf("nearest 2.6 ==> %d\n",val3);
/*After*/
printf("nearest 1.5 ==> %d\n",nearest((double)(1.5)));
printf("nearest 2.5 ==> %d\n",nearest((double)(2.5)));
printf("nearest 2.6 ==> %d\n",nearest((double)(2.6)));
return 0;
}
$cc -c tst1.c
$cc tst1.o -o tst1 -lm
$./tst1
nearest 1.5 ==> 2
nearest 2.5 ==> 2
nearest 2.6 ==> 3
nearest 1.5 ==> 1073741824
nearest 2.5 ==> 1073741824
nearest 2.6 ==> 1074266112
问题是为什么必须将nearest()的返回值分配给要正确打印的变量?我想这涉及到使用的静态链接,但无法找出原因。
答案 0 :(得分:2)
这是因为nearest
没有返回int
。当您将其分配给int
时,C会执行转换,因此使用%d
格式打印它是成功的。当你调用它时,C保留原样。这就是为什么用%d
打印第二次失败的原因。
添加显式强制转换将解决此问题:
/*After*/
printf("nearest 1.5 ==> %d\n",(int)nearest(1.5));
printf("nearest 2.5 ==> %d\n",(int)nearest(2.5));
printf("nearest 2.6 ==> %d\n",(int)nearest(2.6));
答案 1 :(得分:2)
最有可能nearest
返回的内容不是int
,因此第二次格式规范不正确。数值类型之间的转换是隐式的,因此赋值就可以了。
顺便说一句,(double)1.5
是一个多余的演员,因为包含小数点的文字默认为double
。