C ,那些可愛的小陷阱(二)

2021-07-09 03:46:42 字數 978 閱讀 4249

這一次,是關於宣告的乙個小問題:

#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.

from:

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 這個 儘管是用來演示三元轉義符的,但是我看到這個巨集定義暗示另...