静态链接的最近函数不能在C中正确评估

时间:2014-03-21 09:38:35

标签: c unix aix

使用的编译器是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()的返回值分配给要正确打印的变量?我想这涉及到使用的静态链接,但无法找出原因。

2 个答案:

答案 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