① c語言中函數返回類型和函數返回值
返回值:就是在函數調用中被調用的函數會帶回一個函數運行得到的值!
函數返回類型可以是預定義類型(如int
或double)、復合類型(如int&或double*)、用戶定義類型(如枚舉類或void
後者意指函數不返回值)
② C語言中函數可以返回哪些類型的數據(求詳解)
很多人甚至市面上的一些書籍,都使用了void main( ) ,其實這是錯誤的。C/C++ 中從來沒有定義過void main( ) 。C++ 之父 Bjarne Stroustrup 在他的主頁上的 FAQ 中明確地寫著 The definition void main( ) { /* ... */ } is not and never has been C++, nor has it even been C.( void main( ) 從來就不存在於 C++ 或者 C )。下面我分別說一下 C 和 C++ 標准中對 main 函數的定義。
1. C
在 C89 中,main( ) 是可以接受的。Brian W. Kernighan 和 Dennis M. Ritchie 的經典巨著 The C programming Language 2e(《C 程序設計語言第二版》)用的就是 main( )。不過在最新的 C99 標准中,只有以下兩種定義方式是正確的:
int main( void )
int main( int argc, char *argv[] )
(參考資料:ISO/IEC 9899:1999 (E) Programming languages — C 5.1.2.2.1 Program startup)
當然,我們也可以做一點小小的改動。例如:char *argv[] 可以寫成 char **argv;argv 和 argc 可以改成別的變數名(如 intval 和 charval),不過一定要符合變數的命名規則。
如果不需要從命令行中獲取參數,請用int main(void) ;否則請用int main( int argc, char *argv[] ) 。
main 函數的返回值類型必須是 int ,這樣返回值才能傳遞給程序的激活者(如操作系統)。
如果 main 函數的最後沒有寫 return 語句的話,C99 規定編譯器要自動在生成的目標文件中(如 exe 文件)加入return 0; ,表示程序正常退出。不過,我還是建議你最好在main函數的最後加上return 語句,雖然沒有這個必要,但這是一個好的習慣。注意,vc6不會在目標文件中加入return 0; ,大概是因為 vc6 是 98 年的產品,所以才不支持這個特性。現在明白我為什麼建議你最好加上 return 語句了吧!不過,gcc3.2(Linux 下的 C 編譯器)會在生成的目標文件中加入 return 0; 。
2. C++
C++98 中定義了如下兩種 main 函數的定義方式:
int main( )
int main( int argc, char *argv[] )
(參考資料:ISO/IEC 14882(1998-9-01)Programming languages — C++ 3.6 Start and termination)
int main( ) 等同於 C99 中的 int main( void ) ;int main( int argc, char *argv[] ) 的用法也和 C99 中定義的一樣。同樣,main 函數的返回值類型也必須是int。如果main函數的末尾沒寫return語句,C++98 規定編譯器要自動在生成的目標文件中加入 return 0; 。同樣,vc6 也不支持這個特性,但是 g++3.2(Linux 下的 C++ 編譯器)支持。
3. 關於 void main
在 C 和 C++ 中,不接收任何參數也不返回任何信息的函數原型為「void foo(void);」。可能正是因為這個,所以很多人都誤認為如果不需要程序返回值時可以把main函數定義成void main(void) 。然而這是錯誤的!main 函數的返回值應該定義為 int 類型,C 和 C++ 標准中都是這樣規定的。雖然在一些編譯器中,void main 可以通過編譯(如 vc6),但並非所有編譯器都支持 void main ,因為標准中從來沒有定義過 void main 。g++3.2 中如果 main 函數的返回值不是 int 類型,就根本通不過編譯。而 gcc3.2 則會發出警告。所以,如果你想你的程序擁有很好的可移植性,請一定要用 int main 。
4. 返回值的作用
main 函數的返回值用於說明程序的退出狀態。如果返回 0,則代表程序正常退出,否則代表程序異常退出。下面我們在 winxp 環境下做一個小實驗。首先編譯下面的程序:
int main( void )
{
return 0;
}
然後打開附件里的「命令提示符」,在命令行里運行剛才編譯好的可執行文件,然後輸入「echo %ERRORLEVEL%」,回車,就可以看到程序的返回值為 0 。假設剛才編譯好的文件是 a.exe ,如果輸入「a && dir」,則會列出當前目錄下的文件夾和文件。但是如果改成「return -1」,或者別的非 0 值,重新編譯後輸入「a && dir」,則 dir 不會執行。因為 && 的含義是:如果 && 前面的程序正常退出,則繼續執行 && 後面的程序,否則不執行。也就是說,利用程序的返回值,我們可以控制要不要執行下一個程序。這就是 int main 的好處。如果你有興趣,也可以把 main 函數的返回值類型改成非 int 類型(如 float),重新編譯後執行「a && dir」,看看會出現什麼情況,想想為什麼會出現那樣的情況。順便提一下,如果輸入 a || dir 的話,則表示如果 a 異常退出,則執行 dir 。
5. 那麼 int main( int argc, char *argv[], char *envp[] ) 呢?
這當然也不是標准 C 裡面定義的東西!char *envp[] 是某些編譯器提供的擴展功能,用於獲取系統的環境變數。因為不是標准,所以並非所有編譯器都支持,故而移植性差,不推薦使用。
③ c語言 函數返回值類型怎麼用
c語言的函數的默認的返回值是int類型的,如果沒有定義返回類型,則返回類型就是int
只有定義了其它的類型,例如float
add()才是float型的,括弧裡面參數是什麼不影響返回類型
④ 請教:C語言函數的返回值類型能否為結構體
能
只要在定義函數時,返回類型聲明你要返回的類型就可以
參考代碼:
//#include "stdafx.h"//If the vc++6.0, with this line.
#include "stdio.h"
#include "string.h"
struct ABC{
char name[20];
int n;
};
struct ABC myfun(void){
struct ABC x={"Lining",99};//聲明一個結構體局部變數x並初始化
return x;//返回局部變數結構體x
}
int main(void){
struct ABC y=myfun();//聲明一個同類型結構體變數y並將函數返回值賦給它
printf("%s %d\n",y.name,y.n);//打出來看看
return 0;
}
⑤ C語言中函數類型和返回值類型必須一致么
似乎沒有「函數類型」一說。函數的返回值類型是定義函數時確定的,函數的返回值的類型須與定義的函數返回值類型兼容,並不要求完全一致,比如定義的返回值類型是int,可以在函數中返回char型、float型、double型等,但都被自動強制或截斷(編譯時會有精度損失提示)為int型;不兼容的返回值就會過不了編譯,比如定義的返回值類型是char型,卻返回了char *型(或是反過來)則要出錯……
⑥ c語言中函數返回值可以是數組、字元串和結構體嗎
1、ANSIC語言標准,明確規定數組類型和函數類型不可以做為返回值。
解決這種返回值的方法是通過指針來間接返回,即使用數組指針和函數指針。這可以做為c語言引入指針的另一個理由。
2、字元串是數組的一種,是字元數組,所以同樣不可以作為返回值。
3、結構體類型可以做為返回值,C語言設計者當時引入struct結構體的概念,目的是為了增加一種建立C語言新類型的機制,換句話說它希望通過struct建立的類型,像內置的int float類型一樣使用方便。
⑦ C語言規定,函數返回值的類型由什麼決定
c語言規定,函數返回值的類型是由函數首部定義的類型決定。函數返回值應與首部定義的類型一致,如若不一致,則自動將返回值強制轉換為函數首部定義的類型。沒有定義類型時默認為int型。
也就是說你的函數是什麼類型,返回值就是什麼類型。
比如:
函數定義 int fun(int a,char b)
返回值就是整型
函數定義 int *fun(int a)
返回值就是基類型為整型的指針
函數定義 void fun(int a)
無返回值
(7)c語言函數返回值類型可以嗎擴展閱讀
函數可以有返回值,只要 return 就可以給出一個,不過常常不用它,有兩個原因:
1、C/C++里返回值是復制出去的,而對於大的對象,復制的代價很高;
2、有些對象是不能復制的,至少編譯器不知道怎麼復制,比如數組。
於是有了下面這樣的函數:
bool GetObj(ObjType& obj);
bool Encode(const char* src, char* dest);
用一個參數來代替返回值,而返回值只是指示函數執行是否成功。
返回一個大對象是困難的,但這個困難存在於 C 程序中,而不是 C++ 程序中。 C 函數里較少通過返回一個指針來返回對象,因為:
1、如果指針指向棧變數,毫無疑問,要麼不用這個返回值,要麼是一個錯誤;
2、如果指針指向堆變數,需要用這個函數的程序員會好好的看文檔且足夠細心會調用 free,要麼就是內存泄漏;
3、如果指針指向 static 變數,那麼用這個函數的程序員牢牢記住「下次調用這個函數以後,上次的返回值也會跟著變」。
在C++里直接返回裸指針的話,情況並不會有什麼起色,不過 C++ 有智能指針的,通常它們指向堆變數,佔用的空間和裸指針一樣大。考慮前面第一個函數,寫成:
std::auto_ptr<ObjType> GetObj();
返回值如果不要,作為臨時變數,會立即被析構,返回的對象被釋放;如果需要,就得賦值給另一個智能指針。總之不用程序員記得,編譯器會保證這個對象的釋放。
考慮第二個函數,稍微有一點麻煩,因為 auto_ptr 是不能用來持有數組的,不過,在C++的世界裡,std::string 幾乎總是比 char* 好用:
std::auto_ptr<std::string> Encode(const char* src);
最後考慮最麻煩的情況:
bool AssembleObjList(ObjType objList[], size_t length);
⑧ C語言中函數的返回值可以一個結構類型嗎
可以的 比如在做鏈表的增刪改查時基本上都會用到返回結構體類型,如返回頭結點。你可以到網上看看關於鏈表的例子。相信你會明白的。
⑨ C語言函數沒有返回類型也可以嗎
沒有返回類型是不對的,任何函數都有返回值,只不過可以返回void型(不能完全等同於沒有返回值,因為必須註明void),如果定義函數時預設返回值類型,則默認int型。
⑩ c語言函數返回類型默認為什麼類型
函數返回類型是你定義函數時自己決定的,默認為int型
C語言函數格式為:
<類型名>
<函數名>(形參1,形參2……)
類型名就決定了返回類型,如果沒有明確寫出返回類型的話,默認為int類型。
void是空類型,
void必須要明確寫出來才可以,指的是函數不提供返回值,不是默認的。
比如:
函數定義
int
fun(int
a)
返回值就是整型
函數定義
int
*fun(int
a)
返回值就是整型的指針
函數定義
void
fun(int
a)
無返回值