這一次,是關於宣告的乙個小問題:
#include
<
stdio.h
>
intj =24
; int
main()
這能通過編譯嗎?能
這不會產生未定義行為嗎?不會
這程式甚至不是ill-formed(ill-formed就是c++支援但不推薦的寫法),
輸出的結果是:
24 42
這個問題並不難猜到答案,但是大概大部分同學都不敢很肯定地說出來。我們來看看標準如何解釋的這個問題:
j這個名字被宣告了兩次(也使用了兩次),第乙個j宣告的區域涵蓋了整個例子,第乙個j的潛在可用域從這個j的後面立刻開始一直延伸到程式結束,但是它(實際上)的作用域不包括,和}之間的文字。第二個j宣告的區域包括之間的所有文字,但是它的潛在可用域不包括i的宣告。第二個j宣告的實際作用域和潛在可用域是相同的。 下面我補了一張圖,藍色部分就是第二個j的實際作用域。
int j = 24;
int main()
從上面看出c++宣告精確地從宣告的點開始有效,但是還有一些特別要注意的地方,這裡又有幾條c++標準中的小例子,猜猜它們的結果:
intx =12
; const
inti =2
; const
intx =12
; ; }
struct
x ;int
b[x::z];
};答案:
1.第二個x被以它自己的值初始化,變數宣告在初始化之前生效。
2.陣列i被正確初始成大小2,外層變數直到宣告的那一點,都是可見的。
3.enum中的x被正確初始化為12,列舉型別的宣告點緊接它的定義之後(也就是,列舉型別宣告位於宣告生效點之前。)。
4.陣列b被正確初始化為大小16,乙個類成員的定義點之後,類的域中就能查詢到這個名字。
that』s all, thanks.
C ,那些可愛的小陷阱(二)
這一次,是關於宣告的乙個小問題 include stdio.h intj 24 int main 這能通過編譯嗎?能 這不會產生未定義行為嗎?不會 這程式甚至不是ill formed ill formed就是c 支援但不推薦的寫法 輸出的結果是 24 42 這個問題並不難猜到答案,但是大概大部分同學...
C ,那些可愛的小陷阱(一)
此系列是為那些讀過tc pl或者具有類似水平的同學準備的,作為系列的第一篇以及有趣的熱身,我們來看乙個鏈結問題 d1.cpp include stdio.h struct x x x int 0,int 0 class d public x intminus inta,intb d2.cpp inc...
C ,那些可愛的小陷阱(三)
我們沿襲忠於標準的傳統,還是首先來看乙個標準中的例子 define arraycheck a,b a?b?b?a?這真是一段xe的 你看懂什麼意思了麼?好吧這次厚道點立刻上答案 define arraycheck a,b a b b a 這個 儘管是用來演示三元轉義符的,但是我看到這個巨集定義暗示另...