http://blog.csdn.net/zzran/article/details/8667074 2013 1,,“\”引起的錯誤: 在我們現(xiàn)在的編譯器中如果寫下面這段程序
編譯就會用字符的顏色來提示我們,,這兩行內(nèi)容都被當(dāng)做了注釋的內(nèi)容,但是如果在vim下編寫程序,,就不會出現(xiàn)代碼顏色不一樣的問題,,導(dǎo)致程序出錯,是什么原因呢,,是因為"\"的問題,,它在c++或者python語言中,,代表的含義都是本行尚未結(jié)束,下一行仍和本行是一個整體,,所以編譯器會認(rèn)為,,兩行都是注釋,最終導(dǎo)致錯誤,。
2,, 想想這個表達(dá)式: y = x/*p 他的結(jié)果是什么呢? 有可能是x的值除以*p的值的結(jié)果賦給y,,但是在實(shí)際編譯中會出錯,為什么,? 因為編譯器會把 /*當(dāng)成注釋的開始,,之后的內(nèi)容都是注釋,但是要結(jié)束注釋需要找到匹配的*/,,但是沒有找到,,所以編譯會出錯。如果向改正程序的話,,在/, * 之間加一個空格,,或者給他們加一個(),就解決了,。
3,, #define PCHAR char* PCHAR p1, p2; typedef char* pchar; pchar p3, p4; 那sizeof p1, p2, p3, p4都是什么呢,結(jié)果是4,, 1,, 4, 4,,結(jié)果很奇怪吧,,原因要追溯到編譯器對#define的處理,是對#define定義的東西在預(yù)編譯的時候進(jìn)行替換,,也就是說真正編譯的時候是這個樣子 char * p1, p2;這樣該明白p2的值是1的原因了吧,。
4,enum enum_value { VALUE_ONE, VALUE_TWO, VALUE_THREE, }enum_val; 測試一下sizeof enum_val的值,,看是多少,,你會發(fā)現(xiàn)是4,其實(shí)這個原因很簡單,,enum 定義的變量只是一個UINT類型,,而它生命的VALUE_ONE,VALUE_TWO, 只是enum變量的取值范圍而已,,所以enum不是像struct那樣是個結(jié)構(gòu)體,,它表示的只是一個集合,。
5, #define,,因為在預(yù)編譯的時候就會做替換,,所以他不會導(dǎo)致不必要的內(nèi)存分配。同時宏看起來像一個函數(shù),,但不會招致函數(shù)調(diào)用不必要的開銷,。 在定義宏的時候,必須記住為所以得實(shí)參加上小括號,,但即使加上了小括號,,也會遭遇麻煩: #define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b)) 看看下面的調(diào)用: int a = 5, b = 10 CALL_WITH_MAX(++a, b) CALL_WITH_MAX(++a, b + 10) 把實(shí)參替換一下就可以看到,a的遞增次數(shù)取決于它被拿來和誰比較,。
6, int a[6], sizeof(a[6]) 為什么不會出錯,? 因為sizeof 是一個關(guān)鍵字,關(guān)鍵字求值是在編譯的時候,,雖然并不存在a[100]這個元素,,但是這里并沒有真正的去訪問a[6], 而是僅僅根據(jù)數(shù)據(jù)元素的類型確定其值,。 那么函數(shù)引用a[6]就會出錯,,是因為函數(shù)求值是在運(yùn)行的時候。 |
|