當前位置:首頁 » 編程語言 » c語言函數聲明的位置
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言函數聲明的位置

發布時間: 2022-10-07 07:54:23

c語言 在函數聲明時,有時把聲明部分放main上面,有時放main{}裡面,有什麼區別

如果是函數聲明,放的位置是在main內還是外沒有區別,只要在調用之前即可。
但是變數就不同了,在main外 是全局變數,在main內是main函數的局部變數。

② c語言中函數聲明是在大括弧外面還是大括弧裡面

#include<stdio.h>


//函數聲明和定義

void function()

{

printf("hello world!");

}


int main()

{

function(); //函數調用

return 0;

}

1.C語言不允許函數嵌套聲明、定義(即不能再函數裡面再定義一個函數)
2.C語言允許函數嵌套調用
希望對你有幫助!

③ C語言函數的聲明是在哪個位置聲明

在調用前聲明。但通常放在主調函數的開頭部位或所有函數之外的前面。

④ C語言中函數聲明的位置有幾種

對函數的「定義」和「聲明」不是一回事。函數的定義是指對函數功能的確立,包括指定函數名,函數值類型、形參及其類型以及函數體等,它是一個完整的、獨立的函數單位。而函數的聲明的作用則是把函數的名字,函數類型以及形參的類型、個數和順序通知編譯系統,以便在調用該函數時進行對照檢查(例如,函數名是否正確,實參與形參的類型和個數是否一致),它不包括函數體。——譚浩強 ,《C程序設計》(第四版),清華大學出版社,2010年6月,p182

這段論述包含了許多概念性錯誤,這些概念錯誤在許多C語言書中都同樣普遍存在。為了說明這些錯誤,首先來回顧一下C語言演變和發展的一些情況。

最早,C語言的代碼可以這樣寫:

main(){printf("hello,world! ");}

注意,這段代碼對標識符printf沒有進行任何說明。這是因為printf()函數的返回值為int類型。當時的C語言規定,對於沒有任何說明的函數名,編譯器會默認為返回值為int類型,因此對這樣的函數名可以不做任何說明。那個時期的C語言,很多情況下int可以不寫。例如main()函數返回值的類型為int就可以不寫。

但是需要特別說明的是,這種「省勁」的寫法已經過時,從C90標准起,這種寫法就步入了被逐步拋棄的過程(盡管當時還沒有完全立即廢止)。C99廢除了隱式函數聲明法則(remove implicit function declaration),另外,省略main()前面的int也已經不再容許了。

在C語言早期,盡管有時不需要對函數名進行說明,但有些情況下對函數名進行說明還是必須的,比如:

?

12345double sqrt();int main(){printf("%f " , sqrt(9.) );}

這是因為函數sqrt()返回值的類型不是int類型而是double類型,編譯器編譯時需要知道sqrt(9.)這個表達式的類型。

不難注意到這種對函數名的說明非常簡單,這是最早期的一種函數類型說明的形式。這種說明只著重說明函數名是一個函數及其返回值類型,如果程序員在調用函數時存在參數類型或個數方面的錯誤編譯器是無法察覺的,因為函數類型說明中「()」內沒有任何信息。

這種辦法只說明了函數名與()進行運算的結果也就是函數返回值的數據類型,無法進一步檢查參數方面的錯誤是這種寫法的不足之處。

如果不寫函數類型說明,也可以把函數定義寫在函數調用之前:

?

123456789double square ( double x){return x * x ;}int main(void){printf("%f " , square(3.) );return 0;}

這表明函數定義也具有對函數名的類型加以說明的效果,因此從這個意義上來說,函數定義也是一種對函數類型的說明。這種辦法可以檢查出函數調用時在參數個數和類型方面的錯誤。

但是,用這種辦法說明函數名並不好,因為這樣做在編程時還需要考慮應該把哪個函數定義寫在前面,哪個寫在後面的問題。假如函數A調用函數B,函數B調用函數C,函數C又調用函數A,究竟如何安排函數定義的順序就會讓人感到無所適從。此外這種辦法也不利於代碼的組織,在由多個源文件組成的源程序時,這種寫法就更會捉襟見肘、漏洞百出。因此,在1990年,C標准借鑒C++語言規定了一種新的說明函數名的方法,這就是函數原型(Function Propotype)式說明函數類型的方法:

?

12345678910double square ( double ); //或 double square ( double x)int main(void){printf("%f " , square(3.) );return 0;}double square ( double x){return x * x ;}

使用這種辦法,不但可以檢查函數調用時參數類型和個數方面的錯誤,同時解決了源代碼的組織問題,因為程序員不必再考慮該把哪個函數寫在前面、哪個寫在後面這種無聊的問題了。這種辦法全面地說明了函數名的數據類型。此外要說明的是,把形參及其數據類型寫在「()」內形式的函數定義也屬於函數原型(Function Propotype)的范疇。

由此可見,古老的、不對參數進行任何說明的函數類型說明方式、函數定義以及函數原型式的函數類型說明方式都具有說明函數名意義的效用。從這個意義上講它們都是函數聲明。在C語言中,聲明(Declaration)這個詞的本義就是指定標識符的意義和性質(A declaration specifies the interpretation and attributes of a set of identifiers.),某個標識符的定義(Definition)同時也是這個標志符的「聲明」(Declaration)。函數定義(Function definition)則意指包括函數體。(A definition of an identifier is a declaration for that identifier that: ……for a function, includes the function body;)。函數原型則特指包括說明參數類型的函數聲明,它同樣包含用這種方式寫出的函數定義。

現在回過頭來看樣本中的第一句話:「對函數的「定義」和「聲明」不是一回事」。由於函數定義本身就是一種函數聲明,怎麼可以說它們不是一回事呢?這句話的邏輯就如同說「男人」和「人」不是一回事。你可以說男人和女人不是一回事,因為他們沒有交集。但沒法說男人和人不是一回事,因為男人是人的子集,男人就是人的一種,怎麼可以說男人和人不是一回事呢?

那麼,不帶函數體的函數聲明應該如何稱呼呢?在C語言中,它們叫被做「函數類型聲明」(Function type declaration)。函數類型聲明最主要的特點是聲明了函數名是一個函數及其返回值的類型,如果也聲明了參數的類型,則是函數原型式的函數類型聲明。

樣本中的「而函數的聲明的作用則是把函數的名字,函數類型以及形參的類型、個數和順序通知編譯系統,以便在調用該函數時進行對照檢查(例如,函數名是否正確,實參與形參的類型和個數是否一致),它不包括函數體」這句話同樣不通。其主要錯誤是它混淆了「函數原型式類型聲明」與「函數聲明」這兩個概念,前一個概念只是後一個概念的子集。函數聲明中不但包含「函數類型聲明」,也包含「函數定義」和老式的「函數類型聲明」。由於函數定義本身就是一種函數聲明,所以無法斷定函數的聲明是否包括函數體;而且老式的函數類型聲明(例如double sqrt();)也屬於函數聲明,這種函數聲明並不檢查參數類型及個數方面的錯誤。此外函數聲明也並沒有檢查「函數名」正確與否的功能。

這段文字中的「函數類型」這個概念也有錯誤,函數類型所描述的不但包括函數返回值類型,也可能一並描述參數的個數和類型(如果是函數原型),因此不能與「形參的類型、個數」相提並論。

現代的C語言的函數定義和函數類型聲明都採用函數原型式的風格,C99把舊的非原型形式視為過時,這意味著非原型形式以後可能被禁止。

main()函數
在各種C語言書上,能看到各式各樣main()函數的寫法,簡直令人無所適從,這是這么回事?原因主要有兩個:一個是隨著C語言的發展和演化,main()函數的寫法也在不斷變化;另外,某些書籍寫法不規范或誤導的現象也同時存在。

最初main()函數的寫法非常簡潔,那個時候的C程序員哪怕一個字元似乎都不肯多寫。不知道是因為當時鍵盤質量不好還是因為編輯器太糟糕的緣故,那個時代的C程序員似乎驚人地一致崇尚「簡約」——甚至可以說是「至簡」。

?

1234main(){printf("hello,world ");}

這就是main()函數最古老的寫法,K&R在他們的經典名著《The C Programming Language》中的第一個C語言源程序(1978)。這種寫法是那個時代的主流。

簡直和裸體差不多,連#include<stdio.h>也沒有么?在《The C Programming Language》的第一版中確實沒有。那個時代的C語言,返回值類型為int的函數不用聲明。不過在該書的第二版(1988)中這個程序被改成了:

?

12345#include <stdio.h>main(){printf("hello,world ");}

返回值類型為int的函數不用聲明的規則改變了嗎?規則沒有改變。改變了的是觀念,人們已經不再傾向於代碼的「至簡」,而開始傾向於在代碼中交代清楚每一個標識符的來龍去脈。從C89開始倡導在函數調用之前一定要有函數聲明,但並沒有強求,而在C99這已經是強制性的要求了。由於《The C Programming Language》第二版正值ANSI C標准頒布(1989)前夕出版,所以這種變化也應該視為ANSI C標準的傾向性以及K&R對新標準的認同。盡管這個例子沒有完全反映出來這種認同。

為什麼說沒有完全反映出來這種認同呢?因為這個main()的定義並沒有按照函數原型(Function prototype)的方式來寫,C90中規定不帶參數的main()函數應該這樣寫:

?

1int main(void) { /*. . .*/}

但同時規定那個int可以省略。C90把()內不寫任何內容視為過時的寫法,盡管C90無奈地容忍了它(The use of function declarators with empty parentheses (not prototype-format parameter type declarators) is an obsolescent feature.)。

為什麼要容忍?因為有許多老式的代碼還在用。

如果以C99的標准看這個main()寫得如何呢?C99不容許省略int。但同樣只把()內不寫任何內容視為過時,而沒有完全禁止,可見習慣力量的頑固。

那又為什麼說K&R對新標準的認同呢?《The C Programming Language》第二版中的其他函數定義和函數類型聲明基本上都改成了函數原型風格。比如,在講解main()函數的參數時,K&R把原來的main()函數

?

1234567#include <stdio.h>main(argc,argv)int argc;char *argv[];{/*…… */return 0;}

改成了:

?

123456#include <stdio.h>main(int argc, char *argv[]){/*…… */return 0;}

前一個寫法今天已經差不多絕跡,後一個main()以今天的眼光來看有些奇怪,main()的參數是用函數原型風格寫的,但卻沒有寫main()返回值的類型,給人有點半新半舊的感覺。盡管不能說它違背C90(因為C90容許不寫main()前面的int),但如果寫上了返回值的類型int,就同時滿足現代C99標準的要求了。

這里出現的「return 0;」是怎麼回事?這在現代C語言中已經是司空見慣了,它返回給操作系統一個值以表明程序是在何種狀態下結束的。但在另一段代碼中,K&R似乎又走得太遠:

?

1234567#include <stdio.h>main(int argc,char *argv[]){int found = 0 ;/*……計算found的值 */return found;}

這個實在有些「標新立異」,居然把計算結果返回給了操作系統,頗有突破常規之嫌。

那前面幾個沒有「return 0;」的main()函數會怎麼樣?按照C90標准,會返回一個不確定的int類型的值,如果確實不關心這個返回值是多少,不寫確實可以。但C99卻要求編譯器在編譯的時候幫忙給補上這個「return 0;」,C99在必須寫int這個問題上沒有遷就懶人,但在這里卻對偷懶的做法給予了遷就。 問:如果確實不關心main()函數的返回值,把main()的返回值定義為void類型如何?我看到許多書上都這樣寫的。

?

12345#include <stdio.h>void main(){printf("This is a C program. ");}

這在C99之前是一種野路子寫法,究竟從哪裡冒出來的,無據可考。但前幾年的主流教科書中這種寫法很常見。K&R(C語言的發明者)沒有這樣寫過,C90國際標准也不承認這種寫法。Bjarne Stroustrup(C++語言的創始人)在他的關於C++的FAQ中,在回答是否可以寫「void main()」時憤怒地回答說這種寫法在C++和C中都不曾有過。事實上,很多C語言專家都認為「void main()」非常邪惡。

因此,在C99之前,這是不符合標準的寫法。盡管這段代碼的功能似乎是輸出「This is a C program.」,但其實卻不是一個「C program」。

但是有時這樣寫並沒有產生錯誤啊?首先,C語言的錯誤不一定反應在編譯、鏈接或運行過程中。你輸出一個垃圾值也可能一路通過編譯、鏈接或運行,但這不說明你的代碼沒有錯誤,更不能說明這樣的代碼正確、有意義。其次,這樣的寫法在有些編譯器下程序會產生崩潰或得到警告。這說明這種寫法至少不普遍性適用的。可以說,如果不是C99標准,這種寫法根本沒有立錐之地。

C99給了這種寫法以立足之地么?從某種意義上也許可以這樣理解。因為K&R沒承認過這種寫法,C90根本不承認這種寫法,C99雖然沒有正式承認這種寫法,但為這種寫法留了一個後門:「It shall be defined ……or in some other implementation-defined manner」。這意思就是說,如果編譯器明確聲稱允許void main()這種寫法的話,那麼C99不再象C90那樣簡單認為這種寫法違背C標准。

但是不管怎麼說,這種寫法最多是某些編譯器的一種「方言土語」,如果沒有特殊理由,比如僅僅是工作在某個特殊環境,且僅僅使用特定的編譯器而根本不考慮程序的可移植性,為什麼不寫普遍適用的形式呢?

既然很多C語言專家都認為「void main()」非常邪惡,C99為什麼包容這種寫法呢?很難確定C99是否就是打算專門想把這種寫法也「收容」在標准之列。因為除了void main(),還有另外一些main()函數的寫法被C90排除在標准之外了。而現在,這些寫法在理論上也具備了符合C99標準的可能性。

還有什麼樣的main()函數?很多編譯器都支持下面的main()的寫法:

?

12345int main(int argc, char *argv[], char *env[]){/* */return 0;}

居然有3個形參,那個env是做什麼用的?那個參數可以使程序獲得環境變數。

什麼叫環境變數?簡單地講可以理解為操作系統記錄的一些數據,比如計算機的名字,操作系統放在哪裡等等。應用程序在運行時可能要用到這些信息,這時可以通過env這個參數來獲得。

如果編譯器不支持main()的第三個參數怎麼辦?標准庫函數也可以達到同樣的目的。

?

12#include <stdlib.h>char *getenv(const char *name);

是否可以說void main()和int main(int argc, char *argv[], char *env[])也符合C99標准呢?恐怕還不能這么說,現在只是不能說這兩種寫法一定不符合C99標准。但這兩種寫法不符合C90標準是確定的,這兩種寫法的可移植性很差也是確定無疑的。C99標准在這里寫的很模糊,沒有進一步界定「implementation-defined manner」的含義。除非編譯器聲明遵守C99標准,且容許這兩種寫法,否則斷言這兩種寫法符合C99標准屬於空穴來風。

有人說「C99建議把main函數指定為int型」,這種說法對嗎?顯然不對。因為C99並非絕對不包容返回值非int類型的main()。正確的說法是,C90要求main()函數的返回值一定得是int型。但C90容許不寫那個int,而C99則要求必須寫上這個「int」。

下面這種風格如何?

?

123456#include <stdio.h>int main(){printf("This is a C program. ");return 0;}

這個寫法有點不倫不類。返回值的類型int寫了,這個和C89的倡導或C99的要求一致,但是()裡面什麼都不寫,又與標準的所倡導的風格不符,所以說不倫不類。這種寫法目前的標准依然容許,但屬於標准目前尚能容忍的但即將過時的(obsolescent)寫法,被拋棄只是早晚的問題。這種寫法就如同古代的函數形參的寫法一樣:

?

123456main(argc,argv)int argc;char *argv[];{/*…… */return 0;}

都屬於歷史的垃圾。

見過在main()的函數體的「}」之前前寫一句getch();,這個是怎麼回事?這個是時代的產物。在PC從DOS時代轉變為Windows時代的過程中,DOS時代開發的IDE(主要是TC)無法在運行程序後顯示輸出結果,為了在運行後從容仔細地觀察一下運行結果再返回IED界面,加上了這么一句,人為地延長程序運行時間(因為getch()會等待用戶輸入一個字元)。但這與main()本身的結構無關。這條語句不具備普遍意義,只是將就過時的IDE的一種權宜之計而已。所謂不具備普遍意義是指,第一,真正的程序往往不需要這條語句,就是說這條語句與程序功能無關;第二,getch()這個函數並不是標准函數,只有個別的編譯器才支持它,在其他編譯器上寫這條語句,很可能行不通。

為什麼不用getchar()這個標准庫函數呢?getchar()的功能和getch()有點區別,前者會在標准輸出設備上顯示用戶鍵入的字元,這顯得很不利索,而後者則不會顯示用戶所鍵入的字元,更接近「Press Any Key to continue……」的效果。

有的代碼在main()函數結束前寫system("PAUSE");,是否也是這個意思?是的。這也是一種人工製造的「請按任意鍵繼續. . .」,與程序功能結構無關,只是為了方便地觀察輸出結果。但是這種寫法比調用getch()要好,因為system()函數是標准庫函數,各個編譯器都提供支持。

有一種說法,「在最新的C99標准中,只有以下兩種定義方式是正確的:」

?

12345int main( void ){/* */return 0;}


?

12345int main( int argc, char *argv[] ){/* */return 0;}

這種說法對嗎?

這種說法顯然不對。但可以確認的是這兩種定義方式一定正確。不但在C99來說是正確的,以C89來說也是正確的。

還有一種寫法:

?

1234int main( void ){return EXIT_SUCCESS;}

那個EXIT_SUCCESS是怎麼回事?

return EXIT_SUCCESS;是與return 0;等價的一種文雅的寫法。EXIT_SUCCESS是在stdlib.h中定義了的符號常量,返回這個值表示程序任務完成後程序退出。在stdlib.h定義的另一個符號常量EXIT_FAILURE,通常用於程序無法完成任務而退出。

實在太眼花繚亂了,需要記住這么多嗎?顯然沒必要。很多東西都是歷史原因遺留下的垃圾。

如果學習C語言,應該記住或使用哪種呢?顯然是:

?

12345int main( void ){/* */return 0;}


?

12345int main( int argc, char *argv[] ){/* */return 0;}

第一,他們普遍適用,不存在可移植性的問題;

第二,就目前看,他們不存在任何過時或即將過時的成分。當然,如果喜歡文雅,不寫return 0;而寫EXIT_SUCCESS也可以。 順便說一句,有的學習者記不住帶參數main()函數兩個形參的名字。其實這兩個形參的名字也可以自己取,不一定用那兩個名字,只要記住類型就可以了。第二個參數的類型也可以是char **,這和原來的是等價的。

⑤ 函數聲明與函數定義分別在程序中的什麼位置為什麼

函數,是編程語言中可以獨立運行的一個代碼塊。

在C語言中,程序從main()函數開始運行,其他函數要被main函數調用才可以運行。

在從shell解釋器運行編譯好的可執行程序時,main函數會被shell啟動,開始運行。

C語言的函數在使用時要經過3個步驟:聲明、定義、調用。

函數聲明,就是給出函數的原型,讓程序員知道怎麼給函數傳參數,怎麼接收返回值,讓編譯器知道怎麼進行代碼的類型檢查。main函數的聲明是這樣的:

int main();

它的返回值是int類型,不需要傳參數。

printf()函數的聲明是這樣的:int printf(const char* fmt, ...);

它的返回值是int類型,第一個參數是格式字元串,之後可以跟可變參數。

函數聲明的語法是:

返回值類型 函數名(形參類型0 形參變數0, 形參類型1 形參變數1);

如果有多個形參,就以逗號隔開。每個形參都有類型和變數名,其中形參變數名在聲明時可以省略。最後以分號結尾,結束聲明語句。

如果不想讓人看到函數的源碼,就可以只提供一個聲明和一個編譯後的文件,這樣別人就只能看匯編碼了(笑)。C語言的這個設計,對保護知識產權還是有利的。

函數定義,就是在聲明之後不跟分號,而是以大括弧表示函數體,把函數的具體代碼寫在大括弧內部。

上圖中的main()函數就是定義,printf()函數是聲明。

定義,實現的是函數的內容。函數是不能多次定義的,否則編譯器不知道採用哪個定義的代碼。

但函數可以多次聲明,只要聲明都是一樣的,不互相矛盾。

只要打了兩個大括弧{},就算定義了函數。空實現也是實現,可以先佔住這個位置,以後再填寫具體的函數代碼。即,先給出整個程序的框架來,然後再填寫細節。

在實現了函數之後,必須去調用它,它才會運行。

除了main函數是被shell啟動的,其他函數都要直接或間接被main函數調用。

某一個函數在運行時,實際是存在一條從main函數到它的調用鏈的。

函數調用的語法是:

函數名(實參變數0, 實參變數1);

如果有多個實參,則以逗號隔開。如果要接收函數調用的返回值,可以用一個變數去接收:

返回值變數 = 函數名(實參變數0, 實參變數1);

返回值變數的類型,要與函數的返回值類型一致,(返回值變數)在使用之前要先聲明。

對於有返回值的函數,也可以不接收它的返回值。例如,printf()雖然有個int類型的返回值,用於表示列印了多少個字元,但一般不接收它。

所以C語言的入門代碼都是printf("hello world\n");

而不是int ret = printf("hello world\n");

函數名,在C語言中屬於標志符(identity)。

標志符的命名規則是,以下劃線或大小寫字母開始,之後可以跟數字、字母、下劃線,(但不能跟運算符或其他特殊符號)。

它們在代碼中用於表示變數名、結構體類型名、函數名,或者給goto使用的標號。

基本類型的類型名,都被定義為了關鍵字,不能再用作標志符。

struct S {

int a;

int b;

} s;

S是標志符,表示結構體類型S。

a是標志符,表示結構體的成員變數a。

s是標志符,表示變數s,它的類型是結構體類型S。

函數名,也屬於標志符,所以函數名也要以下劃線或大小寫字母開始,不能是關鍵字、運算符、或其他特殊符號。

0123,這不能做函數名,C語言的以0開始的數字是八進制數字。

0x123,也不能做函數名,以0x開始的數字是16進制的數字。

main,可以做函數名,這是主函數,在整個程序里只能有一個,不能作為普通函數的名字。

__schele,以下劃線開始,可以做函數名。

不過,以兩個下劃線開始的函數,大多是Linux系統或C庫的函數。普通函數最好別這么命名。

char,這不能做函數名,它是字元類型的關鍵字。

+,這也不能,它是表示加法的運算符。

CreateWindowEx,這可以做函數名,一看就是典型的匈牙利風格,微軟的代碼(笑)。這個函數是windows系統上創建窗口的API。

匈牙利風格的代碼,是從微軟開始流行的一種風格,函數名以一個或多個英文單詞命名,每個單詞的首字母大寫,其他字母小寫。

不過Linux的代碼(包括第三方的軟體),還是保持上古C代碼的那種下劃線風格,全部字母小寫,單詞之間以下劃線分割,而且多使用縮寫。

有時候,縮寫之後只剩下幾個字母,就直接新組一個詞當函數名了。

例如,Linux上啟動新程序的函數execve(),就是個縮寫的單詞。

執行的英文單詞叫execute,windows上的可執行程序叫exe文件,就是這個詞的前3個字母,Linux也選了這三個字母。

cve這三個字母,來自完整的main函數的參數列表:

int main(int argc, char* argv[], char* envp);

main函數的完整聲明是上面這個樣子的,int main()這個是簡化版的。

其中第一個參數argc,表示要傳給main函數的參數個數。通過命令行參數的形式傳遞。arg是參數argument的縮寫,c就是count,即參數個數。

argv,是(傳給main函數的)參數字元串的數組,v指的是vector。

envp,是環境變數的路徑,environment path。

所以,啟動main的系統調用就叫作execve()了,而不叫StartProgram()。

雖然後者明顯容易理解,但它字母多啊,系統調用的API哪能讓人一眼就看出來是啟動進程的呢(汗)。

回到開頭,main()函數在Linux上就是被execve()這個API啟動的,然後其他函數要被main函數直接或間接調用。

不被main函數(直接或間接)調用的函數,並不會運行。

上圖的代碼只會列印add,因為main只調用了add()函數,沒有調用sub()函數。

這段簡單的代碼,只有這三個函數,sub()沒有被調用。

⑥ C語言中函數聲明的位置有幾種

  1. 在調用的函數前定義函數,此時可以不需要聲明。

2.在調用的函數前聲明。

3.在調用的函數裡面也可以聲明。

4.在其他文件的頭文件*.h文件裡面聲明,然後*.c文件直接調用頭文件也可以。

  1. 把子函數放主函數MAIN函數外並且是之前定義,無需聲明。

2.如果你把子函數放到MAIN函數外,則必須在定義的時候先聲明。

3.如果把 子函數放在MAIN函數中就不需要提前聲明了。

4.聲明一般告訴編譯器有這個對象。可這個'有'字就有2層意思,第一層意思是這個對象在其他地方已經定義過,比如用extern來聲明就有這個意思,因為這個對象已經有了這個時候不會對它分配內存。第二層含義就是這個對象以前沒有是我現在定義的(現在有了以前沒有)這個時候聲明又可以稱為定義他們是重疊的,這個時候給這個對象分配內存。所以可以看出在有定義的地方一定有聲明,有聲明的地方不一定就有定義。定義也是聲明,這是很多人都不了解的地方

⑦ C語言函數聲明的位置的問題

如果被引用函數在其他文件中定義的,就在主函數外聲明;如果是在該文件中定義的,就應當在主函數中聲明。 你的幾個函數都是在一個文件中定義的,所以應當在main 中聲明
希望對你有用!!

⑧ c語言中 關於函數的聲明所放的位置,有的是在main之前,有的是在它之後,為什麼呢有什麼區別

如果放在main之前,就可以直接定義這個函數:
void func(int arg) {
...;
}

main() {
func();
}

如果定義放在main之後就要在main之前先聲明這個函數:
void func(int);

main() {
func();
}

void func(int arg) {
...;
}

⑨ C語言函數聲明是要在主函數內部還是外部啊

函數聲明定義 放在 主函數以外,與主函數地位 並列,不能放在主函數以內。

函數定義 放在 主函數 以後,那麼在 主函數以前,或 在主函數聲明部分(語句以前)要添加函數原型聲明。

函數聲明定義,若放在主函數以前, 主函數中 則 不需要 函數原型聲明。

程序結構:
int main()
{
int process(int u,int t,int (*p)(int u,int t)); // 函數原型聲明
int a,b,c[3],i;
int max(int x,int y); // 函數原型聲明
int min(int j,int k); // 函數原型聲明
int sum(int q,int w); // 函數原型聲明
scanf("%d%d",&a,&b); // 這是語句,要放到聲明以後,所以搬動到這里
。。。 // 其他語句
}

int max(int x,int y) // 函數聲明定義,在主函數以後
{if(y>x)x=y;
return x;
}
。。。 // 其他 函數聲明定義

⑩ c語言中,函數的聲明必須寫到輸入輸出語句之前嗎為什麼

必須寫到之前,函數定義變數,然後系統會開辟空間存儲這些變數,才會有輸出,C語言是由上到下執行的