c語言中規定函數的返回值的類型有什么?
c語言規定,函數返回值的類型是由函數首部定義的類型決定。函數返回值應與首部定義的類型一致,如若不一致,則自動將返回值強制轉換為函數首部定義的類型。沒有定義類型時默認為int型。
也就是說你的函數是什么類型,返回值就是什么類型。
比如:
函數定義 int fun(int a,char b)
返回值就是整型
函數定義 int *fun(int a)
返回值就是基類型為整型的指針
函數定義 void fun(int a)
無返回值
擴展資料
函數可以有返回值,只要 return 就可以給出一個,不過常常不用它,有兩個原因:
1、C/C++里返回值是復制出去的,而對于大的對象,復制的代價很高;
2、有些對象是不能復制的,至少編譯器不知道怎么復制,比如數組。
于是有了下面這樣的函數:
bool GetObj(ObjType& obj);
bool Enwxxxcode-style(const char* src, char* dest);
用一個參數來代替返回值,而返回值只是指示函數執行是否成功。
返回一個大對象是困難的,但這個困難存在于 C 程序中,而不是 C++ 程序中。 C 函數里較少通過返回一個指針來返回對象,因為:
1、如果指針指向棧變量,毫無疑問,要么不用這個返回值,要么是一個錯誤;
2、如果指針指向堆變量,需要用這個函數的程序員會好好的看文檔且足夠細心會調用 free,要么就是內存泄漏;
3、如果指針指向 static 變量,那么用這個函數的程序員牢牢記住“下次調用這個函數以后,上次的返回值也會跟著變”。
在C++里直接返回裸指針的話,情況并不會有什么起色,不過 C++ 有智能指針的,通常它們指向堆變量,占用的空間和裸指針一樣大。考慮前面第一個函數,寫成:
std::auto_ptr
GetObj();
返回值如果不要,作為臨時變量,會立即被析構,返回的對象被釋放;如果需要,就得賦值給另一個智能指針。總之不用程序員記得,編譯器會保證這個對象的釋放。
考慮第二個函數,稍微有一點麻煩,因為 auto_ptr 是不能用來持有數組的,不過,在C++的世界里,std::string 幾乎總是比 char* 好用:
std::auto_ptr<std::string> Enwxxxcode-style(const char* src);
最后考慮最麻煩的情況:
bool AssembleObjList(ObjType objList[], size_t length);