我遇到了这个测验,所以想自己验证一下:
#include <stdio.h>
void
print_sum(a, b)
{
printf("%d\n", a + b);
}
int
main(void)
{
print_sum(1.5, 8.5);
return 0;
}
我用https://godbolt.org/来测试它:
(1) 将
x86-64 clang (trunk)
与-std=c89
选项一起使用,结果为9
;x86-64 gcc (trunk)
加上 -std=c89
选项,结果是 158013177
。a
和b
的默认类型应该是int
,所以在传递给1.5
时,1
应该转换为8.5
,8
转换为print_sum()
。但显然gcc
并没有遵循它。
所以我只是想知道
c89
,这是一个gcc
错误还是上面的程序有“未定义的行为?
程序有未定义的行为。
这个:
void
print_sum(a, b)
是一个“旧式”声明。它生成
a
和 b
类型的 int
参数,但它不会将该信息传达给任何调用者。
此电话:
print_sum(1.5, 8.5);
由于可见声明不是函数的原型,导致编译器假设被调用的函数采用两个
double
类型的参数。
解决方法是将声明更改为原型,即指定其参数类型的声明。改变这个:
void
print_sum(a, b)
对此:
void
print_sum(int a, int b)