&& ve || mantıklı değil, koşullu operatörler?


62

Ben belirten MSDN C # belgelerine göre karıştı biraz duyuyorum &ve |mantıksal operatörler olduğunu ve &&ve ||koşullu operatörler bulunmaktadır.

Ben görüşmeye devam et &&, ||ve !mantıksal operatörler, bu yüzden yanlış mıyım?


4
Mantıksız görünüyor, ancak iki sınıf arasında önemli bir fark var ve çoğu durumda program davranışlarında belirgin bir değişiklik olmadan birbirleriyle değiştirilebildiklerine rağmen, bunun birbiriyle |değiştirilebilir olduğunu varsaymamanız kritik öneme sahip ||.
Daniel R Hicks

Yanıtlar:


120

Ben belirten MSDN C # belgelerine göre karıştı biraz duyuyorum &ve |mantıksal operatörler olduğunu ve &&ve ||koşullu operatörler bulunmaktadır. Ben görüşmeye devam et &&, ||ve !mantıksal operatörler, bu yüzden yanlış mıyım?

Hayır; haklısın

MSDN belgelerinde çok sayıda küçük, çoğunlukla önemsiz isimlendirme hatası vardır; Elimden geldiğince çoğunu çıkarmaya çalıştım, ama ne kadar ustaca yanlış ve yanıltıcı olmadığı durumlarda, her zaman akıllıca kullanılamaz. C # özelliğinin adı hakkında kesin bir ifade istiyorsanız, belirtime gidin.

Öyleyse: ilgili otorite Bölüm 7.11’de belirtilen C # şartnamesidir:

&, ^Ve |operatörler mantıksal operatörler olarak adlandırılır.

Daha sonra yerleşik mantıksal operatörleri tam sayı, numaralandırma, Boolean ve null-Boolean mantıksal operatörlerine ayırmak için devam eder. Kullanıcı tanımlı mantıksal operatörler de vardır; Ayrıntılar için teknik özelliklere bakın.

Bölüm 7.12’de

&&Ve ||operatörler koşullu mantıksal operatörler olarak adlandırılır. Ayrıca “kısa devre yapan” mantıksal operatörler de denir.

Yani hepsi mantıksal operatörler. Bazıları şartlı mantıksal operatörlerdir .

Koşullu mantıksal operatörleri koşullu yapan nedir ? Biri, tipik olarak koşullu ifadelerde ( if) veya koşullu ifadelerde ( ? :) kullanıldığı için kesin bir tahminde bulunabilir . Asıl sebep şartname ile verilmiştir:

&&Ve ||operatörler şartlı sürümleri şunlardır &ve |operatörler: operasyon x && yoperasyonu tekabül x & ydışında yyalnızca değerlendirilir xyanlış değildir. İşlem, işleme x || ykarşılık gelir x | y, ancak yyalnızca xdoğru değilse değerlendirilir .

Koşullu mantıksal işleçler bu şekilde adlandırılır, çünkü sağ el işleneni, sol el işlenenin değerine bağlı olarak koşullu olarak değerlendirilir.

Koşullu mantıksal operatörlerin koşullu ifadeler için sadece "sözdizimsel şekerler" olduğunu belirterek bunu daha canlı görebiliriz . x && ysadece yazmak için daha keyifli bir yoldur x ? y : falseve x || ysadece yazmak için daha keyifli bir yoldur x ? true : y. Koşullu mantıksal ifadeler aslında koşullu ifadelerdir.

Ayrıca koşullu mantıksal operatörün kullanıcı tanımlı bir formu da var ve bu biraz zor. Detaylar için teknik özelliklere bakın.

Daha fazla okuma, eğer bu konu sizi ilgilendiriyorsa:


3
@RobertHarvey: Doğru, & nbsp; onlarda, tamsayı tiplerinde veya enum tiplerinde çalışabiliyor, ancak sadece & nbsp; onlarla faaliyet gösteriyorsa, bunlardan birinin operatörün "koşullu" biçimini seçme seçeneğiyle hiçbir ilgisi yoktur. Koşullu işleç, koşulludur çünkü değerlendirme anlamında koşullu bir dalı vardır.
Eric Lippert

16
"Kısa devre operatörü" terimi, tarif edilen anlamda "koşullu operatör" den çok daha popüler (ve muhtemelen daha az belirsiz) olduğu izlenimindeyim.
Doktor Brown

15
@DocBrown: Kesinlikle popüler, ama her zaman bu ismi yanıltıcı buldum; "kısa devre" ve sonuç elde etmek için "kısa yol" aynı şey olduğunu düşünen biri tarafından icat edilmiş gibi görünüyor. Kısa devre, bir elektrik sistemini hızla tahrip edebilen tehlikeli bir hatadır. C # "güvensiz" bloklarını "güvensiz" olarak adlandırdık, çünkü yanlış kullanılırlarsa tehlikeliler ; İşleri şirin yapmayız, yanıltıcı değeri olan isimleri verelim. Beni Elvis operatörü olarak çalıştırma. :-)
Eric Lippert

26
@EricLippert: "Kısa devre" halk için korkutucu gelse de, K&R'nin gerçek tanım konusunda kafasının karıştığını sanmıyorum. Elektrik mühendisliğinde, bir devreyi kısaltmak her zaman tehlikeli bir hata değildir, aslında bunu her zaman kasıtlı olarak yaparız. Sadece elektriğe daha kısa bir yol izleyerek devrenin istenmeyen bir kısmını kesmek demektir.
hackerb9

1
@CortAmmon: Kullanıcı tanımlı operatör anlambiliminin biraz farklı olduğunu ve ayrıntıları görmek için teknik özellikleri görmem gerektiğini söylediğim aşağıdaki paragrafı okumak isteyeceksiniz.
Eric Lippert

27

C # 'de bunların hepsi mantıksal işleçlerdir.

int x = 0xABCD & 0xFF // x == 0xCD

&&ve ||koşullu mantıksal operatörler” olarak adlandırılırlar çünkü kısa devre yaparlar.

bool someOtherCondition = true;
if (x == 0xEF && someOtherCondition) // someOtherCondition is not evaluated, 
                                     // because x == 0xEF is false

Bu terminolojinin dilden dilden farklı olduğunu unutmayın. C ve C ++ &&ve ||sadece Mantıksal Operatörler. Java &ve Bitwise Operatörleri| denir , C ve C ++ ise bunları Aritmetik Operatörler olarak sınıflandırır .


3
Evet, otorite Microsoft, ancak yetkili belge şartnamedir. Bkz. Bölüm 7.12, Koşullu Mantıksal Operatörler .
Eric Lippert

8
Hikayenin ahlaki olması: Bu operatörlerin yaptıklarını tam olarak anlamak, isimleri hakkında kesin
Robert Harvey,

21
Operatörlerin neler yaptıklarına odaklanın ve kelime dağınıklığını önleyin. Ayrıca bkz . Zararlı Olarak Kabul Edilen Adlandırma .
Robert Harvey,

4
+1. Soruda listelenen her şey, yalnızca bir veya iki ifadeyi alan ve bir değeri değerlendiren operatörlerdir . Sıfatlar gereksiz yere saç dökülmesidir.
Blrfl

3
@RobertHarvey “Zararlı
user11153

-2

Nokta olduğunu &ve |edilmektedir bitsel onlar ve verim bit dizisi değerleri uygulanır, yani, operatörler. Ve bitwise programcılar arasında çok kullanılan bir terimdir.

Mesela 0xff & 0x00 == 0x00, iken 0xff | 0x00 == 0xff.

Ve &&ve ||koşullar uygulanır ve koşulları olağan değerlerinin elde edilir; yani trueve false.

Mesela true && false == false, iken true || false == true.

Bu nedenle &&ve ||denilebilir şartlı o programcılar arasında bir olağan dönem olmadığı halde, operatörler.

Tabii ki her C, C ++, Java ve C # programcısı hepsini biliyor. Ancak sanırım yanlış anlaşılma, "koşullu operatör" bizim programcılar tarafından sıkça kullanılan bir terim olmadığı için gerçekleşiyor.


5
Tabii ki her C, C ++, Java ve C # programcısı hepsini biliyor. OP'nin aptalca olduğunu ima etmek çok kaba bir şey. Aynı programcıları bize yazarak OP’yi dışlarsınız. Lütfen yapma bunu.
DarkDust

1
Daha sonra vereceğiniz cevabın Eric Lippert'in kabul ettiği cevabından sonra herhangi bir katma değer sağladığını ve ayrıca sorunun ne anlama geldiğini anlamamanın yanlış olduğunu sanmıyorum .
Honza Zidek

@DarkDust Her C, C ++, Java ve C # programcısı bu operatörleri anlamalıdır. Bu kaba değil, bir gerçek .
Phil1970

1
@ Phil1970: OP bu operatörleri anlamış görünüyor, isimlerin açıklanması ile ilgili . Bu bağlamda ve Hilton'un cevabındaki ilgili terimleri vurguladıktan sonra, bu cümlenin, her programcının bu adlandırma ayrıntılarını bildiği anlamına geldiği şeklinde yorumlanabilir , ancak siz yapmazsınız . Bu ise yanlış (diğer cevapların tartışmalara görülebileceği gibi) ve onun cümleleme kaba.
DarkDust

4
Sevgili tüm, cevabım kaba görünüyorsa üzgünüm. İngilizce 1. dil değil. Her durumda, OP’nin bir programlayıcı olmadığını ima etmeyi asla istemedim. Aksine, onun okuduğu metinde alışılmadık bir isimle karıştırıldığını kastetmiştim. Tek yapmaya çalıştığım, olağandışı isimleri program bölümleriyle netleştirmek.
Hilton Fernandes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.