2015-03-28 25 views
6

Ben hala açıkça anlayamadık C++ 11 x ^= y ^= x ^= y; geçerli ifade edip (bu thread dedikleri gibi) veya istenmeyen davranışlara yol açar? bağlantı tarafından verilenTamsayıları XOR aracılığıyla tek satırda değiştirin. C++ 11'e gerçekten izin var mı?

nedenleri inandırıcı görünebilir ancak çınlama bir warning atar: 'x' [-Wunsequenced]

Üstelik eğer her iki sürümü için unsequenced modifikasyon ve erişime:

uyarı :

x ^= y ^= x ^= y; // (1) 
x = x^(y = y^(x = (x^y))); // (2) 

olarak eşdeğer (C++ 11 iyi tanımlanmış), neden(farklı sonuçlar vermektedir, second)?

Ayrıca, gcc sadece kod ikinci versiyonunda dizisi noktası etrafında bir warning verir unutulmamalıdır.

+2

Hayır, iyi tanımlanmış değildir. Analiz 'i = ++ i 1 '+ + o [bu soru] (http://stackoverflow.com/questions/24194076/in-c11-does-ii-1-exhibit-undefined- çok benzer davranışı). –

+0

Bu sürümler hiç bir şekilde eşit değildir. – UmNyobe

+1

Ben senin akıl sağlığı için öneride bulunabilir http://stackoverflow.com/questions/29313902/sequence-point-within-assignment-operators – Lingxi

cevap

11

atama operatörü (=) ve bileşik atama operatörleri her grubu sağdan sola. [0]
E1 op = E2 formundaki bir ifadenin davranışı, E1 yalnızca bir kez değerlendirilmesinin dışında E1 = E1 op E2'a eşdeğerdir. x x = x ... yalnızca bir kez değerlendirilen ile

Böylece kodunuzu ...

x = x^(y ^= (x ^= y))); 

eşdeğerdir. Maalesef, xor'lar için, işlenenlerin değerlendirmesi dizisizdir. Yani Aksi belirtilmedikçe

, bireysel operatörlerin işlenenler ve tek ifadelerin alt ifadelerin değerlendirmeler unsequenced bulunmaktadır.

geçerlidir. Ancak şimdi bir sorun vardır: (en soldaki iki x için x tekil değerlendirmede ima)

x = x^(y ^= (x ^= y))); 
//  *   ****** 
//  |   | 
//  |   Side effect 
//  Value computation 

değeri hesaplama ve yan etki olan unsequenced wrt birbirinden dolayısıyla UB oluşturur:

skalar nesne üzerinde bir yan etki ya da aynı sayısal nesne veya aynı sayısal nesnesinin değerini kullanarak bir değer hesaplama başka yan etki için unsequenced göre ise

, davranış tanımlanmamıştır.

+1

ama hala ilk sürümü UB veya – sp2danny

+0

@ sp2danny değilse gerçekten cevap vermez Yanıtımı okudunuz mu? – Columbo

+0

Her iki yapıya da yalın olmaya başlıyor – sp2danny