[爆卦]c副程式回傳值是什麼?優點缺點精華區懶人包

為什麼這篇c副程式回傳值鄉民發文收入到精華區:因為在c副程式回傳值這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者littleshan (我要加入劍道社!)看板C_and_CPP標題Re: [語法] 回傳一個二...


※ 引述《QQ29 (我愛阿蓉)》之銘言:
: Q這樣的prototype 是OK的 傳入一個二維陣列
: 但是我想依樣 return 的型態也寫成 跟Q傳入的一樣
: 但是怎麼寫就是不給我過~
: 原因不明= =
: 請教各位
: 謝謝
首先呢,陣列在 C/C++ 中並不是 first-class object
至少你不能回傳一個陣列

但是你可以回傳一個指向陣列的 pointer
這是合法的
然而 C 的語法有個非常奇怪的地方
那就是宣告陣列時 維度要放在變數的後面

int b[10];

而不是這樣

int[10] b;

所以當你宣告某個指向陣列的 pointer 時,因為 operator priority
語法會變得更有趣:

int *a[10]; // a 是一個陣列,元素是 int*
int (*b)[10]; // b 是一個 pointer,指向有 10 個 int 的陣列
int*[10] c; // 語法錯誤,維度要放後面


現在我們來看函式宣告

(int*)[10] f(); // 錯誤同上,維度要放後面
int *f()[10]; // f() 回傳一個陣列,元素是 int*,
// 但 C/C++ 中函式無法回傳陣列!
int (*f())[10]; // 正確,f() 回傳一個 pointer,指向某個陣列

光看到這種宣告,我就會想要痛毆寫出這種程式碼的人。
事實上,只要 C/C++ 改用「維度放在前面」 的宣告方法,
就可以明顯增加可讀性:

// 以下不是合法的 C/C++
int[3] a; // a 有三個元素
int[3][4] b; // b 是個 4x3 的二維陣列
int[3]* c; // c 是個 pointer,指向「有三個元素的陣列」
int*[4] d; // d 是四個元素組成的陣列,每個元素都是 int*
int[3][4]* f(); // f() 是個函式,回傳的 pointer 指向 4x3 的二維陣列

不過這畢竟不是合法的 C/C++,所幸我們還有 typedef 可用:

typedef int (*T)[10]; // T 的型別就是「指向陣列的 pointer」
T f(); // F() 回傳一個 pointer,指向某個陣列


最後是我誠心的建議:C/C++ 的陣列很難用,別再動歪腦筋了,
請寫個 class 包起來用。


--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 219.87.151.2
VictorTom:推l大, 小弟也會想痛毆寫那種程式的人....>_<# 05/14 12:37
Ebergies:嗯所以我覺得 JAVA 比 C/C++ 漂亮些 05/14 13:35
Fenikso:auto f()->int(*)[10] {return something;} /flee 05/14 13:37

你可能也想看看

搜尋相關網站