SORU
7 NİSAN 2011, PERŞEMBE


Neden XOR ile takas değerleri bu bileşik formu kullanarak başarısız olur mu?

Bu kod, üçüncü bir değişken kullanmadan iki sayının takas etmek, ^ XOR operatörünü kullanarak buldum.

Kod:

int i = 25;
int j = 36;
j ^= i;       
i ^= j;
j ^= i;

Console.WriteLine("i:"   i   " j:"   j);

//numbers Swapped correctly
//Output: i:36 j:25

Şimdi bu eşdeğer kodu için yukarıdaki kodu değiştirdim.

Benim Kod:

int i = 25;
int j = 36;

j ^= i ^= j ^= i;   // I have changed to this equivalent (???).

Console.WriteLine("i:"   i   " j:"   j);

//Not Swapped correctly            
//Output: i:36 j:0

Şimdi, bilmek istiyorumNeden benim kod hatalı çıktı veriyor mu?

CEVAP
7 NİSAN 2011, PERŞEMBE


EDİT: Tamam, anladım.

Yapmak için ilk nokta tabii ki bu kod zaten kullanmamalısın. Bunu genişletmek, ancak eşdeğer hale geliyor

j = j ^ (i = i ^ (j = j ^ i));

(foo.bar ^= i gibi daha karmaşık bir ifade kullanarak olsaydık sadece bir kez değerlendirildi önemli olurdu, ama burada daha basit olduğuna inanıyorum.)

Şimdi, işlenen değerlendirme sırası her zaman soldan sağa doğru, biz almak: başlamak

j = 36 ^ (i = i ^ (j = j ^ i));

Bu (yukarıda) en önemli adımdır.Son yürütülen XOR işlemi için BELİRTİN 36 ile sona erdi ettik. Bu BELİRTİN değildir "OLUŞTURDUĞU sonra j değeri değerlendirilmiştir".

j = 36 ^ (i = 25 ^ (j = j ^ i));

Sonra iç içe geçmiş derin düzeyde bakarak, i j iki yedek edebiliriz:

j = 36 ^ (i = 25 ^ (j = 25 ^ 36));

... olur

j = 36 ^ (i = 25 ^ (j = 61));

Atama için j OLUŞTURDUĞU ortaya ilk, ama sonuçları daha sonra üzerine sonunda zaten, o yüzden görmezden - yok daha ileri değerlendirmeler j önceki son görevi:

j = 36 ^ (i = 25 ^ 61);

Bu şimdi eşdeğerdir:

i = 25 ^ 61;
j = 36 ^ (i = 25 ^ 61);

Ya da:

i = 36;
j = 36 ^ 36;

Olur:

i = 36;
j = 0;

Bendüşünüyorumhepsi doğru ve doğru cevabı alır... Eric için özür değerlendirme düzeni hakkında bazı ayrıntılar biraz kapalı Lippert :(

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • GOTO Conferences

    GOTO Confere

    3 EKİM 2011
  • Harvest: Greg Laurie

    Harvest: Gre

    6 HAZİRAN 2006
  • RayperEnglishKnight

    RayperEnglis

    24 Kasım 2008