1.根據編譯器設計者打思路發展而形成的特性:
數組下表從0而不是從1開始;
C語言打基本數據類型直接與底層硬件相適應。(C語言一開始並不支持浮點類型,直到硬件系統能夠直接支持浮點數之後才增加了對它的支持);
auto關鍵字顯然是擺設;
不允許嵌套函數
2.C預處理器的3個主要功能是:
字符串替換(爲常量提供一個符號名);
頭文件包含;
通用代碼模板的擴展(宏的使用)
3.ANSI C中描述了一些關於不可移植,壞代碼和可移植代碼的術語。
不可移植代碼:
編譯器定義的; 如整數向右移位時,要不要擴展符號位
未確定的--某些(正確)情況下的做法,標準並未規定應該怎麼做。 如參數求值順序。
壞代碼:
未定義的--某些不正確情況下的做法,但標準並未規定應該怎樣做。如一個有符號數溢出時該採取什麼行動。
約束條件--必須要遵守的限制或要求。標準規定編譯器只有在違反語法規則和約束條件的情況下才能產生錯誤信息。這意味着所有不屬於約束條件的語義規則你都可以不遵守。
如: %操作符的操作數必須屬於整數。所以,在非整數數據上使用%操作符肯定會引發一條錯誤信息;
所有在C語言標準頭文件中聲明的標誌符均保留,但這個規定不是約束條件,因此可以違反它,而且編譯器甚至可以不給你警告。
可移植的代碼: 嚴格遵循標準的。
4.應該在表達式中使用強制類型轉換,使操作數均爲有符號數或者無符號數,這樣就不必由編譯器來選擇結果的類型。
int array[] = {1,2,3,5};
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
int d = -1;
if(d<= (int)TOTAL_ELEMENTS -2) // d會被轉換成unsigned int
{
cout<<"yes---------"<<endl;}