繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM