2016-03-20 19 views
16

Aşağıdaki kodu hakkında karıştı:Neden bu C++ kodunda i == 0 değeri var?

#include <iostream> 

int i = 1; 
int main() 
{ 
    int i = i; 
    std::cout << "i: " << i << "\n"; 
    return 0; 
} 

Çıktı: Yukarıdaki kod çalıştıran beklediğinden

i: 0 

1 basacaktır. Birisi bu garip davranışların nedenini açıklayabilir mi?

+24

başlatılmamış kullanılan uyarı, genellikle UB bu. – Maroun

+15

"main.cpp: 13: 13: Variable 'i" uyarısı, kendi başlatılmasında kullanıldığında başlatılmamış: mantıklı bir derleyici tarafından verilen, sorun hakkında bir ipucu olabilir, belki de uyarı seviyenizi sıkın ve onların tavsiyelerine kulak verin. – WhozCraig

+3

int i = i; 'yi atadığınızda, az önce belirttiğiniz değerle, yani tanımlanmamış bir değerle başlatılır. –

cevap

62

i ile başlıyorsunuz. int i = i; 'da i' un ikisi de dış olanı değil. Bu tanımsız davranış ve 0 veya bir şey alabilirsiniz olabilir.

Dış ii için atamak istiyorsanız, doğru yol budur.

#include <iostream> 

int i = 1; 
int main() 
{ 
    int i = ::i; 
    std::cout << "i: " << i << "\n"; 
    return 0; 
} 
BTW

Live Demo


, dikkatle tüm derleyici uyarılarını okumalı. Eğer yaptıysan sorunu kendiniz görebiliyordu:

garip şeyler zaman 'i' Bu işlevin

+12

Bir bit nitelenmek için: "int aralığından 0 veya herhangi bir rastgele değer alabilirsiniz"% 100 doğru değil. UB, bu yüzden her şey olur. Eğer bir zaman portalı tetiklerse ve bu size 100 yılını geleceğe çekerse, bu hala program için geçerli bir davranış olacaktır. Bunu yapan bir derleyiciyi bildiğimden değil (ki bu, bunu uygulayanların test ederken, işlerini paylaşmadan önce ortadan kaybolması gerçeğinden kaynaklanabilir) – johannes

+0

@johannes yepyeni bir seviyedir .. Düzenlendi teşekkürler! –

+5

Standarttan, int i = i olduğu iddiasını destekleyen parçacıklarınız var mı? aslında tanımlanmamış bir davranıştır. Başlatılmamış bir değişken tanımlanmamış bir davranışsa, yalnızca belirtilmemiş bir değere sahiptir. Ve bu kesin yapı standarda (3.3.2) göründüğünden, değerin belirsiz olacağı iddiasıyla, bunun UB olduğunu çok şüpheliyim. –