为什么以下程序能正常工作?
而不是这个程序吗?
在我看来,这两种情况下函数的定义在
int main()
{
int x;
x = foo();
printf("%d",x);
getchar();
return 0;
}
int foo()
{
return 2;
}
而不是这个程序吗?
//double function(void);
int main(){
double val;
val = function();
printf("%ul\n",val);
}
double function(void){
double num;
num = DBL_MAX;
printf("%ul\n",num);
return num;
}
在我看来,这两种情况下函数的定义在
main()
之前都不存在。那么为什么第一种情况下编译器在main()
之前没有函数定义时仍然调用该函数,而第二种情况下却不会呢?
%ul
可以用于double
吗? - Spikatrixprintf()
的格式字符串中吗?不是的;%ul
格式化一个无符号整数,后面跟着一个字母l
,它不是转换说明的一部分。如果你想用%lu
,那么它将会格式化一个无符号长整型。当你将一个double
作为相应值放入参数列表时,这两个选项都不是有用的(或者甚至不可靠)。 - Jonathan Leffler%ul
需要一个unsigned long
。我混淆了%ul
和%lu
。那么,您是在告诉我如果使用%lu
打印double
会导致UB吗? - Spikatrixdouble
。例如,浮点值可能会从整数值分别传递到寄存器中,因此当它看到整数格式时,它会从完全错误的位置读取。使用M68k芯片的计算机曾经在An寄存器中返回指针,在Rn寄存器中返回整数;如果您没有告诉它函数返回指针,编译器将生成代码以从错误的位置读取。我不记得这些芯片如何处理浮点返回。等等。 - Jonathan Leffler