注:閱讀評論這一個第一。約翰尼斯或多或少地用一個很好的標準報價擊倒了我的整個論點。 ;-)
我沒有C++可用的標準,所以我必須從C標準來推斷。
令人驚訝的是(對我來說),章節6.2.1 標識符的範圍沒有說明從其聲明開始的標識符的範圍(正如我會猜到的)。 int a
,在例如具有塊範圍,其中「在相關聯的塊的末端終止」,並認爲是所有所述關於它。章節6.8.6.1 goto語句表示「goto語句不應該從具有可變修改類型的標識符的範圍之外跳轉到該標識符的範圍之內」 - 但是由於您的goto
只能在內跳轉塊(和,因此,int a
範圍,即似乎是OK儘可能ISO/IEC 9899:1999關注
我這個頗爲驚訝 ...
編輯#1:快速谷歌後,我掌握了C++ 0x最終草案。相關說法,我認爲,這是在這裏(6.7 聲明語句,突出礦井):
有可能轉移到塊,但不是在某種程度上 繞過與初始化聲明。 ,其從點與自動 存儲持續時間的變量不是在範圍上的點是在範圍上跳躍的程序是 形成不良除非該變量具有標量類型,類型與 一個平凡缺省構造和一個簡單的析構函數,一個CV-合格 版本這些類型之一的,或 前述類型之一的陣列,並且被聲明沒有初始化。
我覺得你的代碼是由標準的標準確定。但是,屁股醜陋,請記住你。 ;-)
編輯#2:讀你的評論關於可能破壞int a
由於向後跳躍,我發現這(6。6個跳轉語句,突出礦):
轉出一個循環,一個塊外,或回過去初始化的變量的 具有自動存儲持續時間涉及對象與 自動銷燬存儲期限在範圍內,但從 轉移的點不在轉移到的點上。
一,int a
未被「初始化」,並且如果我正確理解標準術語,它不是一個對象。
你基本上是問goto語句是否是一個順序點? –
@Armen如果'a'是類類型的,那麼在它調用它的析構函數之前跳轉。所以我想知道它是否是非班級類型,在它的價值失效之前會跳躍?因此,跳到'z',然後到'u',將'a'保持爲值'10',或者一個局部變量可能使用的某個隨機的其他值,或者'z'處的一些彙編程序操作? –
C++ 0x標準規模較大但寫得較好。與此同時,我們正在糾結於合法性而不是處理現實。我越來越相信上面的代碼是不確定的,應該(即使合法)被編譯器拒絕。 – spraff