2016-06-12 21 views
5

這是我的小程序:在計算初始值時是否定義了變量?

enum Type 
{ 
    b = 1, 
    c = 2 
}; 

int main() 
{ 
    Type b = b; 
    std::cout << b << std::endl; 

    return 0; 
} 

我可以斷定,上述定義包括這連續的步驟,其輸出爲0?

  1. b聲明爲類型的可變Type
  2. 該變量和初始化用0默認值
  3. 評價它的定義是新的值,其包括變量本身(具有值0)
  4. 分配變量的新價值。

而且,變量是否始終使用0進行初始化,即使它們已被顯式初始化?

我的第二個問題是 - 如果它在指定示例中的初始化列表中使用該變量,那麼爲什麼我不明白歧義?編譯器是否首先在變量列表中找到b,然後才檢查聲明的枚舉?

+0

不要這樣做。你只會把自己和任何必須維護代碼的人混淆起來,這些代碼將來會包含你。 –

+0

當然,你是對的!我只是試圖理解該例子中的語言邏輯。 –

回答

7

第1步是正確的,但其餘是錯誤的。發生的是變量b被定義並立即初始化爲變量b的值。這會導致未定義的行爲,因爲b未在初始化之前被初始化。

如果你想將它初始化爲Type::b,那麼你需要明確地寫:

Type b = Type::b; 
+0

明白了。爲什麼它默認使用未初始化的變量而不是Type :: b? –

+0

一旦達到'=',@MisterNobody'b'就在範圍內 –

+0

是的,但我的問題不同。考慮'類型b; b = b;'代碼,爲什麼在賦值中使用了變量,而不是'Type :: b'? –

1

儘管變量被認爲是其自身的初始化過程中定義的,它仍然是非法的,以評估其單元的初始化完成。這就是爲什麼Type b = b未定義的行爲

爲什麼變量定義連的原因是,你可以這樣做:

struct X { 
    int *p; 
    int a; 
}; 
X x = {&x.a, 123}; 
cout << *x.p << endl; 

使用初始化爲目的,而不是自己的評價等是合法的變量。在上面的示例中,x的初始值設定項必須能夠引用x以便計算其成員的地址a。這是合法的,因爲a本身沒有評估(demo)。

+0

不錯的例子,謝謝。 –

相關問題