2012-07-11 18 views
9

X'in aşağıdaki programda sıfıra ulaşıp ulaşmayacağını merak ediyorum."x << = 1" ile art arda değiştikten sonra hiç değer 0 olacak mı?

düşünün:

int main() 
{ 
    int x = 1; 
    while (x) 
     { 
     x <<= 1; 
     } 
    return 0; 
} 

Bu programın beklenen davranış normalde çıkmadan ya da sonsuza kadar döngü olmalı mı?

+1

Kendiniz deneyin! :) – Wires77

+13

Deneme her zaman işe yaramıyor. Özellikle tanımlanmamış davranışlarla. –

+2

, "int" yerine "unsigned int" işlevini kullanır ve çalışır. –

cevap

18

Hiçbiri (veya her ikisi), x taşdığında tanımsız davranışta çalışır.

C99 Spec bölüm 6.5.7 diyor ki:

E1 sonucu < < E2 E1 sola kaydırıldığı E2 bit pozisyonları olduğu; Boş bitler sıfırlarla doldurulur. E1 imzasız bir türe sahipse, sonucun değeri, sonuç türünde gösterilebilen maksimum değerden daha az modüse sahip olan E1 × 2 E2'dur. E1, imzalı bir tipi ve negatif olmayan bir değere sahipse ve sonuç türünde E1 × 2 E2 gösterilebilirse, sonuçta elde edilen değer budur; aksi halde davranış tanımsızdır.

+2

Hızlı cevap için teşekkürler. Gcc-4.8 ile sonsuza dek döngüler yapar, ancak denediğim diğer tüm derleyicilerle normal olarak çıkar (clang, icc, gcc-4.7). – user1519088

+2

@ user1519088 sizin için tanımlanmamış bir davranış var :) –

+2

+1, her ne kadar tamlık için olsa da, OP'nin * amaçlanan * sorusunu muhtemelen cevaplayabilecek bir “imzasız int” için davranışa işaret etmeye değer olabilir. –

İlgili konular