爲什麼下面的程序工作正常?瞭解C中的函數原型
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()
之前沒有定義它,而不是在第二種情況下?
注意,無論是舊的C標準(C99)和當前的C標準(C11)說,方案應生成診斷。只有古老的(C89/C90)標準允許第一個程序工作,而第二個程序總是失敗。如果你喜歡用破碎的代碼工作,那麼很好地寫入sloppier C89標準。寬鬆的規則是歷史的必然。如果沒有鬆懈,標準就不可能取得成功。但是舊的標準已經有15年了,你應該使用它,並且當你使用沒有原型的函數時,你的編譯器會發出警告。如果你的編譯器不行,可以找一個更好的編譯器。 –
@JonathanLeffler,''ul'可用於'雙'嗎? –
在'printf()'格式字符串中?沒有; '%ul'格式化一個'unsigned int',後跟一個字母'l',它不是轉換規範的一部分。如果你的意思是'%lu',那麼格式化一個'unsigned long'。當你在參數列表中傳遞一個'double'作爲相應的值時,它們都不會有用(或者甚至不可靠)。 –