C++ Tips: 類型和聲明

來源:互聯網
上載者:User
  

4.1 保持較小的範圍。     保持較小的範圍有助於避免一些難以發現的錯誤。 C++ 支援在for 迴圈和if 語句中直接聲明變數,如: for (int i=0; i<100;i++){} if (bool b = func() ) {} 其中i 和b 的範圍從被聲明的點開始,直到 } 結束。   4.2 不要在一個範圍和它外圍的範圍裡採用同樣的名字。 在一個範圍和它外圍的範圍裡採用同樣的名字會造成名字遮蔽,即外圍的名字被內部範圍的名字遮蔽,人們很容易沒有注意某個名字被遮蔽了,所以會造成一些隱形錯誤。   4.3 在一個聲明中聲明一個名字。 例如int* p, q; 是指int* p; int q; 而不是int* p; int* q;  int* p, q; 這種結構不利於閱讀 因此應該避免。   4.4 讓常用的和局部的名字比較短,讓不常用的和全域的名字比較長。     選擇好的名字是一種藝術。較大的範圍的名字應該相對比較長且更加明確,如textParser 、intMatrix 。在很小的範圍使用很短且熟悉的名字,如i 、x 、tmp 。常用的名字比較短,書寫方便,不常用的名字比較長這種做法也很有價值。 4.5 避免看起來類似的名字。 如只是大小寫不同的名字,count 和Count 。或者大寫的O 和零0 ,小寫L(l) 和一(1) 都很難分辨,應該避免。一些程式碼分析工具如CodeWizard 會對它們提出警告。   4.6 維持某種統一的命名風格。 應該選擇一種統一的命名風格。如宏定義和枚舉大寫,用底線分隔單詞等。這樣可以提高代碼的可讀性。   4.7 仔細選擇名字,反映其意義而不是反映其實現方式。    例如phone_book 就比number_list 要好,即使你的電話號碼實際存放在list 裡。請仔細選擇那些重要的名字,否則幾個月後自己寫的代碼也會讓你困惑。   4.8 如果所用的內部類型表示某種可能變化的值,請用typedef 為它定義一個有意義的名字。    例如我們想用float 去表示溫度,那麼用typedef 會清晰的表明含義。typedef float Temperature 。Temperature temp;   4.9 用typedef 為類型定義同義字,用枚舉或類定義新類型。    typedef 是為類型定義同義字,而不是定義新的類型。C++ 裡只有枚舉或類是使用者定義型別,可以用來定義新類型。   4.10 切記每個聲明中都必須描述一個類型(沒有“隱式的int “)      例如const c = 7 ;C 和C++ 的早期版本將int 作為沒有明確聲明的類型。這種隱式的int 會導致許多微妙錯誤。   4/11 避免有關字元數值的不必要假設。      一個字元表示的是C++ 程式啟動並執行機器上的字元集中該字元的整數值。如果在一台使用ASCII 字元集的機器上,’0’ 的值就是48 。在非ASCII 字元集的機器上如EBCDIC 字元集,’0’ 的值是240 。char 的大小通常為8 位,但標準並沒有規定它的大小,只是保證至少有8 位。   4.12 避免有關整數大小的不必要假設。 int 的大小是由實現確定的,典型情況下是32 位。short int 至少有16 位,long int 至少有32 位。   4.13 避免有關浮點類型表示範圍的不必要假設。 浮點類型有float 、double 、long double ,它們的大小由實現確定。   4.14 優先使用普通的int 而不是short int 或者long int int 大小由實現選擇,採用在給定的電腦上最適合儲存和操作整數的類型,通常是一個32 位的機器字。   4.15 優先使用double 而不是float 或者long double 浮點類型有float 、double 、long double ,意義由實現確定。對浮點運算的深入理解能協助選擇合適的類型,或者一般情況下選擇double 就可以。   4.16 優先使用普通的char 而不是signed char 或者unsigned char      char 可能是有符號的,也可能是無符號的。這三種char 類型的變數可以相互賦值,但可能導致無定義的結果。例如,char c; signed char sc; unsigned char uc; c = 255; // 如果char 有符號且為8 位,則由實現定義 c = sc; // 可以 c = uc; // 如果普通char 有符號且uc 值過大,則由實現定義 sc = uc; //uc 值過大,則由實現定義 uc = sc ;// 可以, 轉換到unsigned sc = c; /// 如果普通char 無符號且c 值過大,則由實現定義 uc = c; // 可以, 轉換到unsigned 如果始終採用普通char 這些問題都不會出現。   4.17 避免做出有關對象大小的不必要假設。     C++ 對象的大小是用char 的大小的倍數表示的, 按照定義,char 的大小為1 基本類型大小的性質為: 1=sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) 1 <= sizeof(bool) <= sizeof(long) sizeof(char) <= sizeof(wchar_t) <= sizeof(long) sizeof(float) <= sizeof(double) <= sizeof(long double) sizeof(N) = sizeof(signed N) = sizeof(unsigned N)   4.18 避免無符號算術。     通過將變數聲明為unsigned 而保證某些值始終為正的企圖常常被隱含的類型轉換規則破壞。如有這樣的定義,unsigned int ui; int i; 如果恰好ui 的值為0 且 i 的值為-1 ,那麼ui+i 等於多少? -1 ?結果將是unsigned int 類型的最大值。因為i 會被提升到unsigned int ,然後再與ui 相加。 如果是兩個普通的int 相加就不會有問題。   4.19 應該帶著疑問去看待從signed 到unsigned ,或者從unsigned 到signed 的轉換。     如果目標類型是unsigned ,結果值就是從原值中取出正好等於目標類型所需要的那麼多位, 可能會發生截斷。 如unsigned char uc = 1023 ;高位被截斷, uc 的值為255 ,即11111111 如果目標類型是signed ,如果源值在結果類型中可以表示,則值不變,否則結果值由實現定義。 如signed char sc = 1023 ;// 實現定義   4.20 應該帶著疑問去看待從浮點到整數的轉換。     浮點到整數轉換,小數部分將被丟掉,也就是截斷。如果轉換結果無法在目標類型裡表示,則結果無定義。 如:int i = 2.7 ;//i 變為2 char b = 2000.7 ;// 對8 位char 無定義,2000 不能在8 位char 裡表示   4.21 應該帶著疑問去看待向較小類型的轉換,如將int 轉到char     向較小類型的轉換,如將int 轉到char 可能發生截斷, 也可能導致無定義的行為, 參考4.19

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.