SORU
7 Aralık 2009, PAZARTESİ


Neden `i = ı 1` belirlenemeyen bir davranış mı?

Düşünün aşağıdaki C 14882:2003(E) alıntı IEC Standart ISO/(Bölüm 5, paragraf 4):

Belirtildiği yerde, sırası dışında bireysel işlenen değerlendirilmesi bireysel işletmecileri ve taşıyıcının ifadeler, ve sırayla yan etkiler gerçekleşecek. belirtilmemiş. 53) önceki Arasında ve bir sonraki sıra bir skaler nokta nesne, saklanan bir değeri olmayacaktır en fazla bir kez tarafından değiştirilmiş bir ifade değerlendirme. Ayrıca, önceki değeri olacaktır sadece değerini belirlemek için erişilebilir depolanacak. Bu gereksinimlerini paragraf her karşılanır izin verilen emredici tam bir ifade taşıyıcının; aksi davranışı tanımlı değil. [Örnek:

i = v[i  ];  // the behavior is unspecified 
i = 7, i  , i  ;  //  i becomes 9 

i =   i   1;  // the behavior is unspecified 
i = i   1;  // the value of i is incremented

uç bir örnek]

i = i 1 itanımsız bir değer veriyor ki şaşırdım. Herkes aşağıdaki durum için 2 vermez, hangi derleyici bir uygulama biliyor mu?

int i = 0;
i =   i   1;
std::cout << i << std::endl;

Şey operator= iki argüman vardır. İlk önce her zaman i başvuru. Değerlendirme sırasını bu durumda önemli değildir. C Standart tabu dışında herhangi bir sorun görmüyorum.

Lütfendeğilbağımsız değişkenlerin sırası değerlendirme için önemli olduğu bu tür durumlarda göz önünde bulundurun. Örneğin, i i açıkça tanımlanmamış. Benim durumumda sadece lütfen göz önünde bulundurun i = i 1.

Neden C Standardı bu tür ifadeler yasaklıyor mu?

CEVAP
7 Aralık 2009, PAZARTESİ


İki değişken bir fonksiyonu olarak operator= düşünme hata yapmakyan etkileri nerede , bağımsız değişkenlerin fonksiyonu başlamadan önce. tamamen değerlendirilmeli Eğer durum böyle olsaydı, o zaman ifadesi i = i 1 çoklu dizi puan olurdu, ve i atama başlamadan önce tam olarak değerlendirilecek. Bu durumda değil. İçinde değerlendiriliyoratama operatörükullanıcı tanımlı bir operatör değil. Bu ifade sadece bir dizi nokta var.

sonuç i daha önce değerlendirildiği ödev ve ayrıca operatör önce), amayan etkisimutlaka hemen uygulanır. i 1 sonuç her zaman bu ödevin bir parçası olarak i atanır değeri i 2, aynı operatör. i sonuç her zaman bu artış operatör bir parçası olarak i atanır ne kadar 19**. İlk atanan almalısınız kontrol dizisi anlamı yok.

Beri kodudur ihlal kural "arasında, bir önceki ve bir sonraki sıra noktası, bir katı nesne olacaktır onun saklı değer değiştirilmiş en fazla bir kez tarafından değerlendirme ifadesi," tanımsız davranıştır.Neredeyseama, muhtemelen o da i 1 i 2 tahsis edilecektir ilk, sonra diğer değer tahsis edilecektir, ve son olarak program devam edecek çalışan her zamanki gibi — burun şeytanlar ya da patlayan tuvaletler, hayır i 3 da.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Creavite

    Creavite

    8 Mart 2009
  • Jason Rosolowski

    Jason Rosolo

    25 EKİM 2006
  • sknbp

    sknbp

    16 Kasım 2006