2010-10-28 12 views
10

x'u, boole ifadesinin her iki tarafında soldan sonra artırdığım sırada kullanabilir miyim?C++'da `x--> 0 && dizi [x]` iyi tanımlanmış davranış mı?

söz konusu çizgidir:

if(x-- > 0 && array[x]) { /* … use x … */ } 

o standarda aracılığıyla tanımlanmış mı? Dizi [x] x'un yeni değerini mi yoksa eskisini mi kullanacak?

+6

Kodunuzu başkalarının okuması için temiz tutmayı unutmayın, iyi tanımlanmış olsa bile, birileri daha sonra değiştiğinde veya ifadeye eklediğinde bir sorun ortaya çıkarabilir. Sadece benim 2c –

+5

İyi tanımlanmış olsa bile, böyle bir tür kodu kullanmamalısınız. Yazarken onu anlayabilirsin, ama bir sonraki peson olmayabilir. – codymanix

+0

Bu kod, sonuçta hiç de kötü değil. Linux çekirdeğinde daha kötü kod gördük: D – knittl

cevap

12

Bu, bağlıdır.

&&, normal kısa-devre mantıksal işleç ise, o zaman iyi bir dizi noktası olduğu için iyidir. array[x] yeni değeri kullanacaktır. && Eğer

, bir kullanıcı (veya kütüphane) gibi tanımlanmıştır aşırı operatörüdür, daha sonra bir kısa devre, ve aynı zamanda x-- değerlendirilmesi ve array[x] değerlendirilmesi arasında bir dizi noktanın garantisi yoktur. Bu, kodunuza göre olası görünmüyor, ancak bağlam olmadan, kesin olarak söylemek mümkün değil. Bu şekilde düzenlemek için array'un dikkatli tanımıyla mümkün olduğunu düşünüyorum.

Bu nedenle, operator&&'u aşırı yüklemek neredeyse her zaman kötü bir fikirdir. Bu arada, if ((x > 0) && array[--x])if ((x > 0) && array[--x])'un da çok benzer bir etkisi vardır (yine de, shenaniganlara aşırı yüklenme olmadığı varsayımıyla) ve bence daha nettir. Fark, x'un 0'a göre azaltıp azaltmadığı olup olmadığına bağlıdır.

+0

Ne zamandan beri operatöre 've' hiç yüklenemiyor? – zwol

+0

boolean işlecidir && ve aşırı yüklenmemiş – knittl

+0

@Steve: && aşırı yüklendiyse bile yine de davranış tanımlanmış olur, değil mi? –

11

Evet, iyi tanımlanmış. && bir sıralama noktası sunar.

+1

Huh, Size ya da başkalarına çok hızlı cevap vermek için Twitter gibi bir feed kullanmış olduğunuzu hissediyorum. İlk kez bir soru gördüğümde genellikle cevaplandı ...? –

+0

@Alf P. Steinbach, ikinci bir – Harmen

+0

@Alf'de "sorular" bağlantısını tıklayın. Bu soruyu gördüğümde cevapsızdı ve cevapladım. Hile: "Yeni sorular" sayfasını en az 10 saniyede yenileyin. ';-) –

İlgili konular