如果乙個函式的錯誤返回值被包含在正確返回值之中,怎麼處理?

時間 2021-05-06 21:10:09

1樓:Menooker

用Optional

scala裡可以用option,c++新標準裡有optional,都是用來裝乙個值,要麼有值,要麼就是None

2樓:

直接不可以。

因為,如,

int i; // 對16位機,實際是int16_t

i的允許取值範圍是-32768~32767,如果想同時再返回乙個狀態量,用於表示是否錯誤,這個返回錯誤值也會佔乙個編碼值。如果i的取值沒有限制,所有編碼都占用了,則沒有空餘的編碼分配給表示錯誤編碼值了。

下面有幾種方法解決。

(1)用另乙個全域性變數表示錯誤值。

(2)或返回乙個只有兩個元素的陣列,或結構,其中乙個表示錯誤編碼值。與前乙個意思一樣。

(3)或擴大返回值的範圍,修改int i為long i,用擴大後的int i範圍外的編碼值表示錯誤編碼值。獲取鍵盤輸入的字元的方法,就是這樣的,獲取的是char型別值,返回的是int型別值。

(4)返回指向資料的指標,找到資料,指標不會是0,沒有找到指標為空(0,NULL)。

3樓:「已登出」

這種問題通常有幾種思路

1 按照返回值結果範圍確定執行失敗時候的返回值。

比如,正常裡面儲存都是非負數,那麼可以用負數表示執行失敗。

2 通過形參傳位址呼叫,拆分返回值的職能。

在傳入引數裡加入int *out 用來得到鍊錶的值。返回值職能單一,只作為執行成功與否的判定。

3 構造復合返回值

兩種方式

a 構造結構體作為返回值,返回多個值。

b 用大容量資料型別,獲得多個返回值。

舉例,題目返回值要求是int ,可以規定返回值為int64 其中,低32位資料表示返回結果,高32位資料表示函式執行成功與否。具體效果題主一試便知,非常好用。

4 返回指標

函式執行成功則返回資料指標,否則返回NULL。這裡需要注意,返回的指標需要提供對應的釋放指標用的函式介面。

4樓:望山

乙個函式只有乙個返回值,如果正常返回值的範圍有限,那麼可以順便使用那些絕對不可能出現的值表示錯誤狀態。如果理論上可能出現的返回值已經占用了該型別的全部值域,就不能用這個技巧了。這時候最通常的做法是讓函式返回值僅僅代表成功與否的狀態,而真正的有效資料通過函式的引數傳遞,讓函式呼叫者事先準備好用來接受資料的變數,把它的指標傳給函式。

為什麼 C Java 中函式返回值是單一的,而 Matlab Octave 則支援多個返回?

王贇 Maigo 多個返回值可以說只是乙個語法糖,從功能上看,它並沒有做到單個返回值做不到的事情。但是這個語法糖可以使得某些情況下程式簡潔 易讀。比如乙個函式的功能是計算乙個陣列中的最小值和最大值,此時使用兩個返回值就非常好懂 min max minmax a matlab 當然,也可以把最小值和最...

哪些語言和 Rust 一樣, 函式的返回值等同於函式體最後乙個表示式的值

Scheme,Scheme的let,letrec,lambda等等形式裡包含乙個隱式的begin,begin形式的最後乙個表示式的值就是begin形式的值. 不凋花 這種語法其實C語言就有類似的實現,不過一般人不會這麼寫,這有可能是一種C的方言。include intmain int argc ch...

乙個全域性函式 內部返回乙個類的靜態物件的引用 也是可以達到類似單例的效果 怎麼解釋

Jon Lee 注意 Meyer s singleton 在多執行緒時,C 03 下不是thread safe的。從C 11 起變成thread safe了 也有稱之為magic statics 的 Jeson Chen 為什麼會有這種效果和出處已經有人說了,就是靜態物件的生存週期問題。原因書上有說...