如何理解程式語言中的 1

時間 2021-06-02 07:11:33

1樓:

正確的時候,返回偏移量,這個數字一般從0...N-1(至於為什麼從0開始,我相信大家都明白).

那麼錯誤的時候,返回什麼呢,

1, 返回結果如果限定為unsigned型別,那麼只能返回大於等於N的數字.一般選擇為N.

2, 返回結果如果為signed型別,那麼最好是返回負數.一般選擇為-1.

(總不能大家都隨意選擇乙個數字吧)

3, 丟擲異常.

這三種那種方法好呢?

第一種:

N==陣列長度.檢測起來相比也可以接受.

不過這個也有乙個非常潛在的好處.它表示偏移量為最後乙個值的下乙個值的偏移量.這樣可以統一.統一什麼,統一其他資料格式的檢測方法.

比如,鍊表,一樣可以使用這種方法.

是不是這種統一方式,有點超乎想象,這就是C++的STL,為什麼採用這種方式的原因.

第二種:

檢測快速,可以直接檢測是不是負數,也就是意味著檢查該數的第乙個bit,就可以了.

統一,反正我都檢查是否為負數就行了,和陣列多長沒有關係.

缺點:浪費了一半的返回值的表示空間.

絕大部分語言/程式設計習慣都採用這種方式.

第三種:

異常這種方法,並不是所有的語言都有的.至少很多程式設計師的入門語言C是沒有的.而加上了異常,語言就複雜了不少.

優點是:

截然不同的區分了正確流程和錯誤流程.可以更好的處理錯誤情況.

這種方法採用的也不少.這種方法可以和上面兩種方法同時採用.

再吐槽句,-1表示的0xFFFF..,和一般的數字的漢明距離比較大.而0~N-1到N的漢明距離比較小.

這也意味著,從資訊傳輸的角度考慮,-1這種方法,意味著使得二者的距離盡可能的大,從而不容易混淆.而使用N這種方法,如果發生位元位的反轉/互換/丟失,就很容易混淆了.

不過上面僅僅是吐槽而已.一般資料都會進行校驗,如果發生錯亂,就直接丟棄了.而計算機本地程式計算,這種問題就幾乎不需要考慮的.

---- update 2013-03-09 ----

-1,一般在C語言的約定習慣裡用於,範圍之外的不合理/錯誤/異常的值.

例如,某個資料在陣列的第幾個,如果該資料在陣列中,則範圍為0~N-1,如果沒有,則返回-1.(就是題目舉的例子)

今天看到乙個另外乙個例子.

fgetc,如果讀到檔案結束,則返回為EOF,而#define EOF (-1).

fgetc返回的是字元,理論範圍在0x00~0xff之間,而-1=0xFFFF FFFF FFFF FFFF( 32位).

貼出man fgetc的原話:

fgetc() reads the next character from stream and returns it as an

unsigned char cast to an int, or EOF on end of file or error.

道理是一樣的,希望加強大家的理解.

各位覺得主流程式語言中哪個程式語言最容易學習?

Jinhua Luo 最容易 帶有很強烈的主觀色彩,我只發表我的個人偏見,不喜勿噴。我的職業生涯大部分時間用C 在我接觸的語言中,我覺得python最容易學習。科班出身的從業者都學過C,但大家幾乎都明白它的開發效率很低 缺乏豐富的 標準的 普及的各種庫,所以都重造輪子居多 而且維護成本也高 例如記憶...

程式語言中for迴圈和while迴圈的深層區別是什麼?

寒風 看了一下,17年還有人答,我也湊個熱鬧,18年來答下根據我的理解,1 while適合用於狀態變化控制,說高大上點就是while適合做狀態機,而for僅僅是為了迴圈而迴圈 2 另外乙個區別,for迴圈一般都是這麼用的,for int i xx i3 和一有點類似,通常剛學程式的時候會告訴你應盡量...

怎樣運用c語言中的for迴圈程式設計菱形

Big鐵鎚愛笨笨 兩個解法,都已實驗過。請看注釋理解 解法1 include int main for int i n 1 i 0 i for int i n 1 i 2 n 1 i 李展發 藏雲 include intmain for i 0 i 9 i puts a i return0 最正確的...