abs 函式的返回值問題

2022-02-18 02:22:11 字數 1800 閱讀 9700

在牛客網看到一道關於abs()函式返回值的題目,見下圖,當時還沒反應過來,第一反應是:自從我開始學c語言,就知道它是用來求int數的絕對值的,返回值當然是0或者正數啊,一看答案就是a。

後來思來想去,質問自己 難道這道題就這麼簡單?於是果斷先查函式庫,得到:

#include //或math.h

int abs( int num );

發現庫函式的返回值形式都寫的是int,為什麼是int?經過深入的思考、驗證和查閱資料,最後得出:

當num為0或正數時,函式返回num值;

當num為負數且不是最小的負數時(即0x80000000),函式返回num的對應絕對值數,即將記憶體中該二進位制位的符號位取反,並把後面數值位取反加一;

當num為最小的負數時,由於正數里int型別32位表示不了這個數的絕對值,所以依然返回該負數。

貼上**執行結果:

也就是說,對於普通程式設計師來說,直接用abs來求乙個數的絕對值並沒有想象中那麼安全,如果恰好給它傳遞了乙個最小的負數作為引數,得到的依然是這個負數,而不是它的絕對值,也許後面將會發生各種意想不到的情況。因此,每一位程式設計師都應該明白:呼叫函式後檢查函式返回值是乙個優秀程式設計師應該具備的基本素養。

「經常反問:這個變數或表示式會上溢或下溢嗎?」(《程式設計精粹-microsoft編寫優質無錯c程式秘訣》p80,steve maguire 著)

引用一段來自乙個部落格的話作為結束:

ansi c標準規定了每種整數型別的最小值域(但沒有規定它們必須採用哪種編碼方案),並要求所有的c語言實現都要在limits.h標頭檔案中通過諸如int_min、int_max這樣的巨集來指定該實現中整型資料的實際值域,而且這些實際的值域一定不能比標準規定的最小值域還要小(也即要求每種實現在limits.h中定義的巨集的絕對值不小於c標準規定的同名巨集的絕對值,並且正負號要保持一致)。
標準定義的int_min是-(2^15 - 1),int_max是(2^15 - 1),換句話說,標準保證了int型資料至少能表示-(2^15 - 1)到(2^15 - 1)這樣乙個對稱區間內的所有整數,因此程式設計師可以放心大膽地用int變數儲存以上範圍內的任何整數。但與此同時請特別注意,用int變數表達超出上述範圍的數將是一件沒有法律(標準即是程式設計師的法律)保障的事情,所以不應該想當然地認為-32768(即-2^15)一定可以用int型來表達,儘管它確實位於用二次補碼記法(twos-complement notation)進行編碼的16位整數的值域內。熟悉以上背景後再回顧abs函式的問題就會發現,實際上該函式對於標準規定範最小值域內的所有整數都能正常工作,而上面提到的引起錯誤的輸入資料已經不在此範圍內了,所以此錯誤不應由abs而應由函式呼叫者負責。由此可見,為了安全以及可移植性,將表示式欲表示的值嚴格限制在標準指定的最小值域內是乙個良好的程式設計習慣。

math h的abs返回值

math.h的abs返回值 正確答案 c 你的答案 a 錯誤 a.不可能是負數 b.不可能是正數 c.都有可能 d.不可能是0 c中的函式申明為 int abs int num 正常情況下,num為0或正數時,函式返回num值 當num為負數且不是最小的負數時 不要問我最小的int型別負數是多少,上...

函式返回值的問題

執行結果 1 您輸入的是23456 2 function text val 3 您輸入的是中國北京 text 23456 var s text window.alert s s 中國北京 function text val var s text 23456 window.alert s functi...

C C 函式返回值問題

函式返回值問題 在c c 中 內建型別 char short int long float double 結構體型別 聯合體型別union 列舉型別enum 函式返回值分為三種情況 1.函式返回值小於等於4位元組時,返回值由eax暫存器帶回。2.函式返回值大於4位元組小於等於時,返回值是由eax和e...