[英]statically linked nearest function won't evaluate properly in C
使用的编译器是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()的返回值分配给变量才能正确打印? 我猜这与使用的静态链接有关,但无法弄清楚原因。
这是因为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));
最有可能nearest
返回值不是int
,因此第二次格式指定不正确。 数值类型之间的转换是隐式的,因此赋值就可以了。
顺便说一句, (double)1.5
是多余的强制转换,因为包含小数点的文字默认为double
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.