&& та || не логічні, але умовні оператори?


62

Мене трохи збентежила документація MSDN C #, в якій сказано, що &і |логічні оператори, і що, &&і ||оператори умовні.

Я продовжую виклику &&, ||і !логічні оператори, так що я не маю рації?


4
Це здається нелогічним, але є важлива різниця між двома класами, і важливо, щоб ви не вважали, що, скажімо, |взаємозамінні ||, хоча в багатьох випадках вони можуть бути замінені без явної зміни поведінки програми.
Даніель Р Хікс

Відповіді:


120

Мене трохи збентежила документація MSDN C #, в якій сказано, що &і |логічні оператори, і це, &&і ||є умовними операторами. Я продовжую виклику &&, ||і !логічні оператори, так що я не маю рації?

Немає; ти прав.

У документації MSDN є численні невеликі, переважно неважливі номенклатурні помилки; Я намагався вивести їх якомога більше, але міг, але у випадках, коли це не є абсолютно невірним та оманливим, це не завжди розумне використання часу. Перейдіть до специфікації, якщо ви хочете остаточне твердження про назву функції C #.

Отже: відповідним органом є специфікація C #, яка вказана в розділі 7.11:

&, ^І |оператори називаються логічні оператори.

Потім він продовжує розбивати вбудовані логічні оператори на цілі, перелічувальні, булеві та нульові-булеві логічні оператори. Існують також визначені користувачем логічні оператори; докладні відомості див.

У розділі 7.12 маємо

Ці &&та ||оператори називаються умовні логічні оператори. Їх також називають логічними операторами «короткого замикання».

Тож усі вони є логічними операторами. Деякі з них є умовними логічними операторами .

Те , що робить умовні логічні оператори умовної ? Можна гарно здогадатися, що це тому, що вони зазвичай використовуються в умовних операторах ( if) або умовних виразах ( ? :). Справжня причина задана специфікацією:

Оператори &&та ||оператори є умовними версіями операторів &та |операторів: Операція x && yвідповідає операції x & y, за винятком того, що yвона оцінюється лише у тому випадку, якщо xвона не відповідає хибності. Операція x || yвідповідає операції x | y, за винятком того, що yоцінюється лише в тому випадку, якщо xце неправда.

Отже, умовні логічні оператори називаються тим, що операнд правої руки оцінюється умовно залежно від значення операнда лівої руки.

Ми можемо бачити це яскравіше, зазначивши, що умовні логічні оператори є лише «синтаксичними цукрами» для умовних виразів . x && yце просто більш приємний спосіб писати x ? y : false, і x || yце просто більш приємний спосіб писати x ? true : y. Умовні логічні вирази - це насправді умовні вирази.

Існує також визначена користувачем форма умовного логічного оператора, і це трохи хитро. Деталі див. У специфікації.

Подальше читання, якщо ця тема вас цікавить:


3
@RobertHarvey: Правильно, той факт, що & може працювати на bools, цілі типи або enum типи, але && працює лише на bools, не має нічого спільного з вибором називати одну з них "умовною" формою оператора. Умовний оператор є умовним, оскільки він має умовну галузь у своїй семантиці оцінювання.
Ерік Ліпперт

16
Я перебуваю під враженням, що термін "оператор короткого замикання" набагато популярніший (і, мабуть, менш амбітний), ніж "умовний оператор" в описаному сенсі.
Док Браун

15
@DocBrown: Це, безумовно, популярне, але я завжди вважав це ім'я оманливим; здається, що його придумав той, хто думав, що "коротке замикання" та "скорочення" для отримання результату - це одне і те ж. Коротке замикання - небезпечна несправність, яка може швидко зруйнувати електричну систему. Ми назвали "небезпечні" блоки в C # "небезпечні", оскільки вони небезпечні, якщо використовуються неправильно ; давайте не будемо давати речі люб’язними, але оманливими іменами з обмеженою цінністю. Навіть не запускайте мене з оператора Елвіса. :-)
Ерік Ліпперт

26
@EricLippert: Хоча "коротке замикання" може здатися страшним для широкої громадськості, я не думаю, що K&R не плутають фактичне визначення. В електротехніці коротке замикання ланцюга не завжди є небезпечною несправністю, адже ми робимо це навмисно постійно. Це просто означає вирізати небажану частину ланцюга, надаючи електриці коротший шлях, який слід пройти.
hackerb9

1
@CortAmmon: Ви хочете прочитати наступний параграф, де я зазначаю, що визначена користувачем семантика дещо відрізняється, і ви повинні побачити специфікацію для деталей.
Ерік Ліпперт

27

У C # - це всі логічні оператори.

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

&&і ||називаються " умовними логічними операторами", оскільки вони мають коротке замикання.

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

Зауважте, що ця термінологія відрізняється від мови до мови. В C і C ++ &&і ||просто логічні оператори. У Java &і |називаються операторами побітових операцій , тоді як C і C ++ класифікує їх як арифметичні оператори .


3
Так, Microsoft є повноваженням, але авторитетним документом є специфікація. Див. Розділ 7.12, Умовні логічні оператори .
Ерік Ліпперт

8
Мораль цієї історії: важливіше зрозуміти, що саме роблять ці оператори, ніж бути точним щодо їх імен.
Роберт Харві

21
Зосередьтеся на тому, що роблять оператори, і перестаньте нав'язуватися словником. Дивіться також Названня вважається шкідливим .
Роберт Харві

4
+1. Все, що перераховано у запитанні, - це лише оператори, які приймають один чи два вирази та оцінюють до значення. Прикметники - це непотрібне роздвоєння волосся.
Blrfl


-2

Справа в тому , що &і |є побітовим оператори, тобто вони застосовуються до і виходу бітового значення рядка. І побіт - це дуже вживаний термін серед програмістів.

Наприклад 0xff & 0x00 == 0x00, поки 0xff | 0x00 == 0xff.

І , &&і ||застосовуються до умов, і дають звичайні значення умов; тобто trueі false.

Наприклад true && false == false, поки true || false == true.

Тому &&і ||можна було б назвати умовними операторами, незважаючи на те, що не є звичайним терміном серед програмістів.

Звичайно, це знає кожен програміст C, C ++, Java та C #. Але я здогадуюсь, що трактується неправильно, тому що "умовний оператор" не є терміном, який часто використовуються нами програмістами.


5
Звичайно, це знає кожен програміст C, C ++, Java та C #. Це дуже грубо, що писати, маючи на увазі, що ОП - дурне. Те саме, написавши нам програмістів , ви виключаєте ОП. Будь ласка, не робіть цього.
DarkDust

1
Я не думаю, що ваша пізніша відповідь не приносить ніякої додаткової цінності після прийнятої відповіді Еріка Ліпперта, і, крім того, невірна в розумінні не розуміння суті питання.
Honza Zidek

@DarkDust Кожен програміст C, C ++, Java та C # повинен розуміти цих операторів. Це не грубість, а факт .
Phil1970

1
@ Phil1970: ОП, схоже, розуміє цих операторів, йдеться про уточнення іменування . У цьому світлі та підкресливши відповідні терміни у відповіді Гілтона, його речення можна інтерпретувати як таке, що кожен програміст знає про ці деталі іменування, але ви цього не робите . Це є неправильним (як можна бачити в обговоренні інших відповідей) і його фразування груба.
DarkDust

4
Шановні всі, вибачте, якщо моя відповідь виглядала грубо. Англійська мова не є першою мовою. У будь-якому випадку я ніколи не мав намір натякати на те, що ОП не був програмістом. Au contraire, я мав на увазі, що його чи вона збентежила незвична назва в тексті, який він читав. Все, що я намагався зробити, - це уточнити незвичне іменування фрагментами програми.
Хілтон Фернандес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.