2009-08-30 15 views
7

Bir tamsayı döndüren bir C işleviniz varsa, şu şekilde bir ifade yazabilirsiniz:& = Ve | = için tanımlı bir değerlendirme sırası var mı?

MyInt &= MyFunc(); 

... biz bitsel-AND atama işlecini kullanıyoruz.

Soru: MyInt sıfıra eşit olsa bile MyFunc() tarafından yürütülmeyi garanti ediyor mu?

Benzer şekilde, bitly-OR atama işlecini (| =) kullansaydık, MyInt tümü ayarlanmış olsa bile MyFunc() her zaman çalıştırılır mı?

Başka bir deyişle: bitly operatörler için tembel değerlendirme C'de izin verilir mi?

cevap

1
MyInt &= MyFunc(); 

eşdeğerdir. Bununla birlikte, bir iyileştirici, MyInt sıfır ise, işleve çağrı yapmama kodunu üretebilir ve işlevin hiçbir yan etkisi olmadığından emin olabilir. Çalışma zamanı testi muhtemelen bir kötümserlik yaptığı için, derleyicilerden hiç şüphe duymadığından şüphe ediyorum.

+1

"MyInt" öğesinin bir kez ** değerlendirildiği dışında (yan etkileri olan bir ifade olduğunda önemi olabilir.) –

+0

Atamadaki LHS'deki şey değerlendirilmeyecektir. –

+0

Neil: 'myMap [" test "] | = 10;' myMap.operator [] 'bir şey yazdırır. İkinci formda iki kez basılacak, ancak bir kez bileşik atama formunda. –

8

Hayır. Biten operatörler kısa devre yapmazlar. MyInt'un değeri ne olursa olsun MyFunc() yürütme garantilidir.

MyInt = MyInt & MyFunc(); 

dil & operatör kısa devre olmadığını bildiriyor: için

İlgili konular