i& i || nie są logiczne, ale są operatorami warunkowymi?

62

Jestem nieco zdezorientowany dokumentacji MSDN C #, który stanowi, że &i |są operatory logiczne i że &&i ||są operatory warunkowe.

Ciągle dzwoni &&, ||a !operatory logiczne, więc nie mam racji?

John V.
źródło
4
Wydaje się to nielogiczne, ale istnieje istotna różnica między dwiema klasami i bardzo ważne jest, aby nie zakładać, że powiedzmy, że |jest wymienna ||, chociaż w wielu przypadkach można je zamieniać bez widocznej zmiany w zachowaniu programu.
Daniel R Hicks,

Odpowiedzi:

120

Jestem nieco zdezorientowany dokumentacji MSDN C #, który stanowi, że &i |są operatory logiczne i że &&i ||są operatory warunkowe. Ciągle dzwoni &&, ||a !operatory logiczne, więc nie mam racji?

Nie; masz rację.

W dokumentacji MSDN występuje wiele małych, głównie nieistotnych błędów w nomenklaturze; Próbowałem wydobyć ich jak najwięcej, ale w przypadkach, w których nie jest to rażąco złe i wprowadzające w błąd, nie zawsze mądrze jest wykorzystać czas. Przejdź do specyfikacji, jeśli chcesz definitywne oświadczenie o nazwie funkcji C #.

Tak więc: właściwym organem jest specyfikacja C #, która stwierdza w sekcji 7.11:

Operatory &, ^i |nazywane są operatorami logicznymi.

Następnie przechodzi do dalszego podziału wbudowanych operatorów logicznych na liczby całkowite, wyliczenie, logiczne i nullable-logiczne operatory. Istnieją również operatory logiczne zdefiniowane przez użytkownika; szczegóły w specyfikacji

W sekcji 7.12 mamy

Te &&i ||operatorzy są nazywane warunkowe operatorów logicznych. Są one również nazywane operatorami logicznymi „zwierającymi”.

Wszystkie są więc operatorami logicznymi . Niektóre z nich to warunkowe operatory logiczne .

Co powoduje, że warunkowe operatory logiczne są warunkowe ? Można by podejrzewać, że dzieje się tak, ponieważ są one zwykle używane w instrukcjach warunkowych ( if) lub wyrażeniach warunkowych ( ? :). Prawdziwy powód podano w specyfikacji:

&&I ||operatorzy są wersje warunkowego &i |operatorzy: Operacja x && yodpowiada operacji x & y, oprócz tego, że yjest oceniana tylko wtedy, gdy xnie jest fałszywy. Operacja x || yodpowiada operacji x | y, z tym że yjest oceniana tylko wtedy, gdy xnie jest prawdziwa.

W ten sposób nazywane są warunkowe operatory logiczne, ponieważ prawy operand jest oceniany warunkowo w zależności od wartości lewego operandu.

Widzimy to bardziej żywo, zauważając, że operatory logiczne warunkowe są po prostu „cukrami składniowymi” dla wyrażeń warunkowych . x && yjest po prostu przyjemniejszym sposobem pisania x ? y : falsei x || yjest po prostu przyjemniejszym sposobem pisania x ? true : y. Warunkowe wyrażenia logiczne są w rzeczywistości wyrażeniami warunkowymi.

Istnieje również zdefiniowana przez użytkownika postać warunkowego operatora logicznego i jest to trochę trudne. Szczegółowe informacje można znaleźć w specyfikacji.

Dalsza lektura, jeśli ten temat Cię interesuje:

Eric Lippert
źródło
3
@RobertHarvey: Racja, fakt, że & może działać na boolach, typach całkowitych lub typach wyliczeniowych, ale && działa tylko na boolach, nie ma nic wspólnego z wyborem nazywania jednego z nich „warunkową” formą operatora. Operator warunkowy jest warunkowy, ponieważ w swojej semantyce oceny ma gałąź warunkową.
Eric Lippert,
16
Mam wrażenie, że termin „operator zwarcia” jest znacznie bardziej popularny (i prawdopodobnie mniej niejednoznaczny) niż „operator warunkowy” w opisywanym znaczeniu.
Doc Brown
15
@DocBrown: Z pewnością jest popularny, ale zawsze uważałem tę nazwę za mylącą; wydaje się, że został wymyślony przez kogoś, kto uważał, że „zwarcie” i „skrót” do uzyskania wyniku są tym samym. Zwarcie jest niebezpieczną usterką, która może szybko zniszczyć układ elektryczny. Nazwaliśmy „niebezpieczne” bloki w języku C # „niebezpieczne”, ponieważ są niebezpieczne, jeśli są używane nieprawidłowo ; nie nadawajmy słodkich, ale mylących nazw obciążonych wartością. Nawet nie zaczynaj mnie od operatora Elvisa. :-)
Eric Lippert,
26
@EricLippert: Chociaż „zwarcie” może wydawać się przerażające dla ogółu społeczeństwa, nie sądzę, aby K&R myliło się co do faktycznej definicji. W elektrotechnice zwarcie obwodu nie zawsze jest niebezpieczną usterką, w rzeczywistości robimy to cały czas celowo. Oznacza to po prostu wycięcie niechcianej części obwodu, dając prądowi krótszą ścieżkę do naśladowania.
hackerb9
1
@CortAmmon: Będziesz chciał przeczytać następujący akapit, w którym wzywam, że semantyka operatora zdefiniowana przez użytkownika jest nieco inna i że powinieneś zobaczyć specyfikację dla szczegółów.
Eric Lippert,
27

W języku C # są to wszystkie operatory logiczne.

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

&&i ||nazywane są „ warunkowymi operatorami logicznymi”, ponieważ powodują zwarcie.

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

Pamiętaj, że ta terminologia różni się w zależności od języka. W C i C ++ &&, a ||to tylko Operatory logiczne. W Javie, &i |nazywane są bitowe operatora , natomiast C i C ++ klasyfikuje je jako operatory arytmetyczne .

Robert Harvey
źródło
3
Tak, Microsoft jest organem, ale autorytatywnym dokumentem jest specyfikacja. Zobacz rozdział 7.12, Operatory logiczne warunkowe .
Eric Lippert,
8
Morał tej historii jest taki: ważniejsze jest dokładne zrozumienie, co robią ci operatorzy, niż precyzyjne określenie ich nazw.
Robert Harvey
21
Skup się na tym, co robią operatorzy, i przestań mieć obsesję na punkcie słownictwa. Zobacz także nazewnictwo uważane za szkodliwe .
Robert Harvey
4
+1. Wszystko wymienione w pytaniu to tylko operatory, które przyjmują jedno lub dwa wyrażenia i oceniają je na wartość. Przymiotniki to niepotrzebne rozdwajanie włosów.
Blrfl,
-2

Chodzi o to, że &i |logicznie operatorów, co oznacza, że są stosowane do bitowe wydajność wartości ciągów. Bitowe jest bardzo popularnym terminem wśród programistów.

Na przykład 0xff & 0x00 == 0x00podczas 0xff | 0x00 == 0xff.

I &&i ||są stosowane w warunkach i dają zwykle wartości warunkach; tj . truei false.

Na przykład true && false == falsepodczas true || false == true.

Dlatego &&i ||można nazwać warunkowe operatorów, mimo że nie jest to zwykły termin wśród programistów.

Oczywiście każdy programista C, C ++, Java i C # wie o tym wszystkim. Ale chyba źle zrozumiano, ponieważ „operator warunkowy” nie jest terminem często używanym przez nas, programistów.

Hilton Fernandes
źródło
5
Oczywiście każdy programista C, C ++, Java i C # wie o tym wszystkim. To bardzo niegrzeczna rzecz do napisania, sugerująca, że ​​OP jest głupie. To samo pisząc do nas, programistów , wykluczacie PO. Proszę nie rób tego.
DarkDust
1
Nie sądzę, aby twoja późniejsza odpowiedź przyniosła jakąkolwiek wartość dodaną po zaakceptowaniu odpowiedzi Erica Lipperta, a ponadto jest niepoprawna w rozumieniu niezrozumienia sensu pytania.
Honza Zidek
@DarkDust Każdy programista C, C ++, Java i C # powinien zrozumieć tych operatorów. To nie jest niegrzeczne, ale fakt .
Phil1970,
1
@ Phil1970: OP wydaje się rozumieć tych operatorów, chodzi o wyjaśnienie nazewnictwa . W tym świetle i po podkreśleniu odpowiednich terminów w odpowiedzi Hiltona, jego zdanie można interpretować jako oznaczające, że każdy programista wie o tych szczegółach nazewnictwa, ale ty nie . Jest to błędne (jak widać w dyskusjach na temat innych odpowiedzi), a jego sformułowanie jest niegrzeczne.
DarkDust,
4
Szanowni wszyscy, przepraszam, jeśli moja odpowiedź była niegrzeczna. Angielski nie jest pierwszym językiem. W każdym razie nigdy nie zamierzałem sugerować, że OP nie był programistą. Au contraire, miałem na myśli, że był on zdezorientowany nietypowym nazwaniem w tekście, który czytał. Wszystko, co próbowałem zrobić, to wyjaśnić niezwykłe nazewnictwo według fragmentów programu.
Hilton Fernandes