2016-06-12 24 views
5

Bu benim küçük bir programdır:Başlangıç ​​değerleri, başlangıç ​​değerlerinin hesaplanması sırasında tanımlanmış mı?

Yukarıdaki tanım bu ardışık adımlardan oluşur sonucuna Can 0. verir
enum Type 
{ 
    b = 1, 
    c = 2 
}; 

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

    return 0; 
} 

? Çeşidi değişken olarak b arasında

  1. beyanı Type
  2. 0 varsayılan değer o
  3. değerlendirilmesi ile bu değişken ve başlatma tanımı bu
  4. atama (0 değeri) ile değişken kendisini içeren yeni bir değer, Bu yeni değer değişkendir.

Ayrıca, açıkça başlatılmış olsa bile değişkenler her zaman 0 ile başlatılır mı?

İkinci sorum şu: eğer değişken, belirtilen örnekte başlangıç ​​listesindeki değişken kullanıyorsa, neden belirsizliğe dair bir hata alamıyorum? Derleyici, önce değişken listesinde b bulmaya çalışıyor ve yalnızca sonradan numaralandırmayı kontrol ediyor mu?

+0

Bunu yapma. Kendinizi ve gelecekte bu kodu içeren kodu korumak zorunda olan herkesi kafanızda karıştırırsınız. –

+0

Elbette, haklısın! Sadece bu örnekte dil mantığını anlamaya çalıştım. –

cevap

7

Adım 1 doğru, ancak diğerleri yanlış. Olan şey, b değişkeninin tanımlandığı ve b değişkeninin değerine hemen başlamasıdır. Bu, , kendi başlatılmasında kullanılmadan önce başlatılmamış olduğundan tanımsız davranış neden olur. Değişken kendi başlatma sırasında tanımlanan sayılır

Type b = Type::b; 
+0

Anladım. Ve neden varsayılan olarak Type :: b yerine başlatılmamış değişken kullanıyor? –

+0

@MisterNobody 'b',' = 'ulaşıldığında en kısa sürede kapsamlıdır –

+0

Evet, ama sorum farklı. Tür b'yi düşünün; b = b; 'code, atamada neden değişken kullanılır, 'Type :: b' yerine? –

1

rağmen, onun başlatma tamamlandıktan o üniteyi değerlendirmek için hala yasadışı şudur: Type::b bunu başlatmak istiyorsanız

o zaman bunu açık şekilde yazmaya gerek . Bu nedenle, Type b = b, tanımlanmamış davranışı'dur.

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

kendi değerlendirme dışında yasal amaçlarla başlatıldı değişken kullanma: Bunu böylece

değişken bile tanımlanır nedeni budur. Yukarıdaki örnekte, x başlatıcısı, a üyesinin adresini hesaplamak için x'a başvurmalıdır. Bu yasaldır, çünkü a'un kendisi değerlendirilmez (demo).

+0

Nice örneğine bakın, teşekkürler. –