Письменные версии логических операторов - PullRequest
84 голосов
/ 04 марта 2010

Это - единственное место, где я когда-либо видел and, or и not, перечисленные как действительные операторы в C ++. Когда я написал тестовую программу в NetBeans, я получил красное подчеркивание, как будто произошла синтаксическая ошибка, и обнаружил, что веб-сайт был неправильным, но это неправильный NetBeans, потому что он скомпилирован и работает как ожидалось.

Я вижу, что ! предпочтительнее not, но читаемость and && or кажется выше, чем у их грамматических братьев. Почему существуют эти версии логических операторов и почему, похоже, никто не использует их? Это действительно правильный C ++ или какая-то совместимость с C, которая была включена в язык?

Ответы [ 4 ]

99 голосов
/ 04 марта 2010

Они возникли в C в заголовке <iso646.h>. В то время существовали клавиатуры, которые не могли набирать необходимые символы для && (например), поэтому заголовок содержал #define, которые помогли бы им в этом, определив (в нашем примере) and быть &&. Конечно, с течением времени это стало менее используемым.

В C ++ они стали так называемыми альтернативными токенами . Вы не должны включать что-либо для использования этих токенов в совместимом компиляторе (поэтому версия заголовка C на языке C ++, <ciso646>, пуста). Альтернативные токены аналогичны обычным токенам, за исключением написания. Таким образом, во время синтаксического анализа and является точно таким же, как &&, это просто другой способ написания одной и той же вещи.

Что касается их использования: поскольку они используются редко, их использование часто более удивительно и запутанно, чем полезно. Я уверен, что если бы это было нормально, их было бы намного легче читать, но люди так привыкли к && и || всему, что только отвлекает.

РЕДАКТИРОВАТЬ: Однако я видел очень небольшое увеличение их использования, так как я опубликовал это, однако. Я все еще избегаю их.

15 голосов
/ 17 декабря 2013

Они существуют для удобства использования (поддержка символов в вариантах клавиатуры / дисплея) и общей читабельности, но есть еще одна причина, которая в настоящее время более выражена. Почти ни один из ответов здесь , здесь , или даже основной ответ здесь не объясняет основную причину, по которой многие из нас предпочитают версии слова по сравнению с версиями символа ( и главная причина, по которой их используют другие языки): ошибки. Различия между версиями слова очень заметны. Различия между версиями символов заметно меньше, что приводит к искушению ошибок в сравнительно гораздо большей степени: «x | y» во многом не является «x || y», но при вложении в большее выражение многие из нас пропустить разницу. Это похоже на обычное случайное смешивание оператора присваивания и равенства. По этой причине я отучил себя от версий символов (это было нелегко) в пользу версий слов. Я бы предпочел, чтобы кто-то сделал двойную попытку из-за нашей любви к старым вещам, а не искушал жуков.

10 голосов
/ 04 марта 2010

В C ++ это настоящие ключевые слова. В C это макросы, определенные в <iso646.h>. Смотри http://web.archive.org/web/20120123073126/http://www.dinkumware.com/manuals/?manual=compleat&page=iso646.html.

2 голосов
/ 14 января 2019

and и && функционально одинаковы в C ++.Операторы and и or действительно действительны для C ++ и являются частью языкового стандарта.

Для уточнения других ответов на конкретном примере есть еще одна причина, помимо простой "читабельности", предпочитая andболее &&.Выражение «и» в явном виде, когда логическое «И» - это то, что вы имеете в виду, исключает возможность тонких ошибок.

Учтите это:

int x = 3;
int y = 4;

// Explicitly use "and"
if (x and y) {
    cout << "and: x and y are both non-zero values" << endl;
}

// Using "&&"
if (x && y) {
    cout << "&&: x and y are both non-zero values" << endl;
}

// Oops! I meant to type "&&"!
if (x & y) {
    cout << "&: x and y are both non-zero values" << endl;
}
else {
    cout << "How did I get here?" << endl;
}

Все три оператора ifбудет компилироваться, но последний означает что-то совершенно другое и непреднамеренное!

Если вы всегда используете and, когда имеете в виду логическое И, вы никогда не сможете случайно набрать один «&», и ваш код будет успешно скомпилирован ибегите с загадочными результатами.

Еще одно хорошее упражнение: попробуйте случайно отключить символ «и» и посмотрите, что произойдет.;)

...