[英]function prototype declarations
我正在練習c中的函數並遇到程序....
#include<stdio.h>
int main()
{
float a=15.5;
char ch ='C';
printit(a,ch);
return 0;
}
printit(a,ch)
{
printf("%f\n%c",a,ch);
}
我想知道為什么上面的程序編譯而不給出我到目前為止所理解的錯誤是...
必須使用特定的原型聲明c中的函數(但此程序不包含原型)
為什么程序給char變量給出輸出“ x”?
c中的函數可以像在函數聲明中所做的那樣在不聲明參數類型的情況下接受值嗎?
首先,在C語言中不需要在調用函數之前為其提供原型。 在C99版本的語言中,要求在調用函數之前先聲明一個函數,但仍不需要提供原型。
由於您的編譯器沒有抱怨,因此您必須使用C89 / 90編譯器,而不是C99編譯器。
其次,在C89 / 90中,當您調用未聲明的函數時,將傳遞float
和char
類型的參數,就像在
printit(a,ch);
編譯器將執行默認參數提升,並實際傳遞double
和int
類型的值。 必須相應地定義您的函數,代碼才能正常工作。 您將函數定義為
printit(a, ch)
{
...
該定義意味着兩個參數都具有int
類型。 這違反了以上要求。 您的代碼的行為是不確定的。 進一步分析代碼或猜測為什么以打印方式打印內容不再有意義。 您的代碼的行為再次是未定義的。
您的(未聲明的)函數的正確定義可能如下所示
int printit(double a, int ch)
{
...
或者,可以用K&R樣式將其定義為
printit(a, ch)
float a;
{
...
那可能會使您的代碼正常工作。 但是,更好的方法是在調用printit
之前為其提供原型。 您要決定使用哪個原型void printit(double a, int ch)
或void printit(float a, char ch)
或其他方式-由您決定。
void printit(float a, char ch) {
printf("%f\n%c",a,ch);
}
int main()
{
float a=15.5;
char ch ='C';
printit(a,ch);
return 0;
}
該代碼幾乎絕對應該讀為:
#include <stdio.h>
void printit(float a, char ch);
int main()
{
float a=15.5;
char ch ='C';
printit(a,ch);
return 0;
}
void printit(float a, char ch)
{
printf("%f\n%c\n",a,ch);
}
如果您想寫得整整齊齊。 但是,要解決以上問題:
1)您應該包括一個原型,是的。 但是,由於只編譯一個單元(.c文件),所以編譯器可以很容易地算出函數的位置以及含義。 我得到這個:
test.c:11: warning: conflicting types for ‘printit’
test.c:7: note: previous implicit declaration of ‘printit’ was here
我強烈建議使用-Wall -Werror -pedantic
進行編譯,以將類似這樣的警告轉換為錯誤並中止編譯,從而迫使您編寫正確的代碼,從而在以后減少錯誤。
2)我換行得到15.5,然后得到C。 我不確定Z的來源。
3)您不必指定類型-但是,如果沒有指定類型,則編譯器將在類型不兼容時警告您,因此不會受益。 一種真正常見的情況是將數據傳遞給程序集。 並非絕對需要它,但是它可能違反了標准C,並且絕對不是最佳實踐。
問題1: printit
是在main
之后定義的,解決方法是將函數原型放在頂部。 問題2:正確聲明函數原型(您未編寫return和arguments類型)解決方案:
#include <stdio.h>
void printit(float a, char ch);
int main()
{
float a=15.5;
char ch ='C';
printit(a,ch);
return 0;
}
void printit(float a, char ch)
{
printf("%f\n%c",a,ch);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.