Teknik olarak, genel olarak bu Tanımlanmamış Davranış'dır .
Ancak cevabın iki önemli yönü var.
Kod ifadesi:
std::cout << a++ << a;
şu şekilde değerlendirilir:
std::operator<<(std::operator<<(std::cout, a++), a);
Standart, bir işleve yönelik argümanların değerlendirme sırasını tanımlamaz.
Bu yüzden ya:
std::operator<<(std::cout, a++)
önce değerlendirilir veya
a
önce değerlendirilir veya
- herhangi bir uygulama tanımlı sıra olabilir.
Bu sipariş, standarda göre Belirtilmemiş [Ref 1] 'dir.
[Ref 1] C ++ 03 5.2.2 İşlev çağrısı
Para 8
Argümanların değerlendirme sırası belirtilmemiştir . Bağımsız değişken ifade değerlendirmelerinin tüm yan etkileri, fonksiyon girilmeden önce yürürlüğe girer. Postfix ifadesinin ve bağımsız değişken ifade listesinin değerlendirme sırası belirtilmemiş.
Ayrıca, bir fonksiyon için argümanların değerlendirilmesi arasında bir sıra noktası yoktur, ancak bir sıra noktası yalnızca tüm argümanların değerlendirilmesinden sonra mevcuttur [Ref 2] .
[Ref 2] C ++ 03 1.9 Program yürütme [giriş.yürütme]: 17. paragraf
:
Bir fonksiyonu çağırırken (fonksiyon satır içi olsun veya olmasın), tüm fonksiyon argümanlarının (varsa) değerlendirilmesinden sonra, fonksiyon gövdesindeki herhangi bir ifade veya ifadenin yürütülmesinden önce gerçekleşen bir sıra noktası vardır.
Burada değerine, c
araya giren bir sıra noktası olmadan birden fazla kez erişildiğine dikkat edin, bununla ilgili olarak standart şunu söylüyor:
[Ref 3] C ++ 03 5 İfadeler [ifade]: 4. paragraf
:
....
Önceki ve sonraki sıra noktası arasında, bir skaler nesnenin depolanmış değeri, bir ifadenin değerlendirilmesiyle en fazla bir kez değiştirilecektir. Ayrıca, önceki değere yalnızca depolanacak değeri belirlemek için erişilecektir . Bu paragrafın gereklilikleri, bir tam ifadenin alt ifadelerinin izin verilen her sıralaması için karşılanacaktır; aksi takdirde davranış tanımsızdır .
Kod, c
sıra noktası araya girmeden birden fazla değişiklik yapar ve saklanan nesnenin değerini belirlemek için ona erişilmez. Bu, yukarıdaki hükmün açık bir ihlalidir ve dolayısıyla standart tarafından zorunlu kılınan sonuç, Tanımlanmamış Davranış [Ref 3] 'dür .