Письмові версії логічних операторів


94

Це єдине місце, яке я коли-небудь бачив and, orі notвказане як фактичні оператори на C ++. Коли я написав тестову програму в NetBeans, у мене з’явилося червоне підкреслення, як якщо б була синтаксична помилка, і я зрозумів, що веб-сайт невірний, але це NetBeans, що не так, оскільки він складено та працює як слід.

Я можу бачити, !що я віддаю перевагу, notале читабельність and&& orздається більшою, ніж їхні граматичні брати. Чому ці версії логічних операторів існують і чому, схоже, ніхто не використовує їх? Це дійсно дійсний C ++ чи якась сумісність із C, яка була включена до мови?


4
\ me Переписує весь його код
Обмежене Спокута

2
в дусі "чистого коду" я особисто рекомендував би відмовитися від звички писати ||і &&, можливо, навіть !часом. Слова завжди краще, ніж "шум лінії", не кажучи вже про можливу плутанину з операторами маніпулювання бітами.
Ічтьо

2
@Ichthyo Це не завжди правильно. Це швидше прочитати багато символів і знати їх значення, ніж читати багато слів.
валентін

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

3
Іронія сказати, що andце читабельніше, а потім писати " and&& or", хоча :)
Іван Вергілієв

Відповіді:


111

Вони зародилися в С у заголовку <iso646.h>. У той час з'явилися клавіатури , які не могли б ввести необхідні символи &&(наприклад), так що заголовок містив #define«S , який буде допомагати їм у цьому, в силу (в нашому прикладі) визначення andбути &&. Звичайно, з плином часу це стало менш використовувати.

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

Що стосується їх використання: оскільки вони рідко використовуються, їх використання часто є більш дивним і заплутаним, ніж корисним. Я впевнений, якби це було нормально, їх було б набагато легше читати, але люди так звикли &&і ||все інше просто відволікає.

EDIT: Однак я помітив дуже незначне збільшення їх використання з моменту публікації цього повідомлення. Я все одно їх уникаю.


Тож чи інтерпретація цих альтернативних лексем є лише компіляторною функцією чи вона міститься у специфікації C ++?
дефектна

2
@Kavon: Це вказано в розділі 2.5 стандарту; це мовна особливість.
GManNickG

15
Я особисто думаю, що вони набагато кращі ... але тоді я упереджений Python. Я не знаю, чому деякі люди розуміють, що якщо це не вбрано, це не код ...
Матьє М.

Отже, вони не дійсні в C, не включаючи цей заголовок файл? Я здивований, що цим користуються не всі; вони роблять Python набагато більш читабельним.
ендоліт

1
Принаймні Visual Studio 2015 CTP 6 не сподобався моєму orабо notбез включення заголовка.
usr1234567

18

Вони існують для зручності користування (підтримка символів у смаках клавіатури / дисплея) та загальної читабельності, але є ще одна причина, яка сьогодні є більш вираженою. Майже жоден з відповідей тут , тут , або навіть головний відповідь тутвикладіть основну причину, що багато хто з нас віддають перевагу версій слів над версіями символів (і головна причина, якою користуються інші мови): помилки. Відмінності між версіями слів дуже помітні. Відмінності між версіями символів помітно менші, тому до спокуси помилок порівняно значно більшою мірою: "x | y" дуже не "x || y", але коли багато хто з нас вбудовується у більшу виразність пропустити різницю. Це схоже на загальне випадкове змішування оператора присвоєння та рівності. З цієї причини я відлучив себе від версій символів (це було непросто) на користь версій слів. Я вважаю за краще, щоб хтось подвоював їх через нашу любов до старих речей, ніж спокуси помилок.


4
На жаль, у Visual Studio (станом на VS2013) потрібно встановити певний варіант компілятора ( /Za) для підтримки альтернативних ключових слів (див. Stackoverflow.com/a/555524/368896 ). Це, мабуть, має й інші наслідки. Тож у Visual Studio не обов'язково безпечно приймати цю пораду.
Дан Ніссенбаум

FWIW / - як я розміщую пробіли навколо операторів, x | yдостатньо візуально відрізняється (в односхилих шрифтах) від x || y, але я можу знайти, !наприклад, if (!f(xyz) && ...простіше пропустити, ніж if (not f(xyz) && ....
Тоні Делрой

@Tony D, коли ви ставите пробіли навколо операторів, це ваша приватна умова і не очевидна для читача. Але використання природних мов, таких як and, orі notв булевому виразі, фактично покращує читабельність, плюс це підкреслює відмінність від бітових маніпуляцій. Таким чином, ІМХО нам слід розглянути можливість змінити старі улюблені звички на краще ...
Іхтьо,

@DanNissenbaum Я знайшов цю опцію під назвою C / C ++> Мова> Вимкнути розширення мови , тому порівняно безпечно очікувати побічних ефектів;)
Вовк

6
Чи знаєте ви, скільки помилок Python було введено через те, що слова andта orупередження думають про те, як вони повинні працювати? Наприклад, if (a == b or c)замість цього if (a == b || a == c)- щось подібне майже щодня з’являється тут у StackOverflow. Абстрактні символи, від’єднані від англійської мови, зменшують ці помилки.
Марк Рансом

10

У C ++ вони є реальними ключовими словами. У C вони макроси, визначені в <iso646.h>. Дивіться http://web.archive.org/web/20120123073126/http://www.dinkumware.com/manuals/?manual=compleat&page=iso646.html .


6
Технічно це альтернативні лексеми, а не ключові слова. :)
GManNickG

2
@GMan: +1 Приємний дзвінок, однак, сторінка Dinkumware називає їх ключовими словами, тому, я думаю, вони не надто переймалися розрізненням.
Кріс Єстер-Янг

Оновлене посилання: f3.tiera.ru/1/addesio/computer-science/C&C++/…
kevinarpe

Отже, чи підтримує MSVC їх поза рамками в C ++, але не в C?
rwst

1
@rwst Я не можу коментувати MSVC спеціально, але якщо він реально реалізує стандарти C ++ і C, то це дійсно так і буде. Дивіться також: stackoverflow.com/questions/2376448/…
Кріс Єстер-Янг

2

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коли ви маєте на увазі логічне І, ви ніколи не зможете випадково ввести єдине "&" і примусити свій код скласти успішно та працювати з таємничими результатами.

Ще одна гарна вправа: спробуйте залишити персонажа "і" випадково і подивіться, що станеться. ;)


1
Це насправді не відповідь на питання. Це ти лише зазначиш, що ти вважаєш більш розбірливим. ОП запитала про те, як працюють письмові версії, а не які кращі. І хтось уже зробив те саме, що ви намагаєтесь зробити.
Нікол

Не те, що вона дійсно надає більше корисної інформації, але я додам " andі &&є функціонально ідентичними" у відповідь ... І якщо ви прочитаєте мою відповідь, ви побачите, що я кажу НЕ про розбірливість;)
tjwrona1992
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.