逻辑运算符的书面版本


94

是我见过的唯一地方andor并且not在C ++中被列为实际的运算符。当我在NetBeans中编写测试程序时,我得到了红色下划线,好像有语法错误,并认为该网站是错误的,但是NetBeans却是错误的,因为它按预期进行了编译和运行。

我可以看到!它受到青睐,not但是and&& 的可读性or似乎比他们的语法兄弟更好。为什么存在这些版本的逻辑运算符,为什么似乎没有人使用它?这是真正有效的C ++还是该语言随附的与C的某种兼容性?


4
\ me重写了他所有的代码
有限赎罪

2
本着“干净代码”的精神,我个人建议消除编写||和的习惯&&,甚至!有时。字总是比“线路噪声”更好,更不用说与位操作运算符的混淆了。
伊奇优

2
@Ichthyo并不总是正确的。与阅读大量单词相比,阅读许多符号并了解它们的含义要快得多。
vallentin

对于人类读者来说,更清晰的内容取决于“格式塔”。有时,一个符号可能比一些混乱的术语更清晰,但在这种情况下却不是。而且,英语的简单单词比某种奇怪的编程语言的一些怪异特殊符号更通用……
Ichthyo

3
具有讽刺意味的是,and虽然更具可读性,然后再写“ and&& or” :)
Ivan Vergiliev

Answers:


111

它们起源于下在头<iso646.h>。当时有一些键盘无法&&(例如)键入所需的符号,因此标题(包含#define)可以通过(在我们的示例中)定义and为来帮助他们这样做&&。当然,随着时间的流逝,这种使用变得越来越少了。

在C ++中,它们成为了所谓的替代令牌。你不会需要包括任何一个兼容的编译器使用这些标记(如如此,C ++ -指明分数的C头的版本,<ciso646>是空白)。除拼写外,替代标记与常规标记类似。因此,分析过程中and完全相同一样&&,它的拼写同样的事情只是用不同的方式。

关于它们的使用:由于很少使用它们,因此使用它们通常比有用的方法更加令人惊讶和混乱。我敢肯定,如果这是正常的话,它们会更容易阅读,但是人们已经习惯了&&||其他任何事情都会使人分心。

编辑:自从我发布了这篇文章以来,我已经看到它们的使用量有很小的增加。我仍然避免他们。


那么这些替代标记的解释仅仅是编译器功能,还是在C ++规范中?
瑕疵

2
@Kavon:在标准的2.5节中指定;这是语言功能。
GManNickG 2010年

15
我个人认为它们要好得多……但是我对Python有偏见。我不知道为什么有人会说如果它不乱码也不是代码...
Matthieu M.

因此,如果不包含该头文件,这些在C中无效吗?令我惊讶的是,每个人都没有使用它们。它们使Python更具可读性。
endlith 2013年

1
至少Visual Studio 2015 CTP 6不喜欢我的标题ornot不包含标题的标题。
usr1234567

18

它们的存在确实是出于可用性(键盘/显示样式中的字符支持)和一般可读性的考虑,但是今天还有另一个原因更加明显。几乎没有一个答案在这里在这里,甚至主要的答案在这里阐明我们许多人更喜欢单词版本而不是符号版本的主要原因(也是其他语言使用它们的主要原因):错误。单词版本之间的差异非常明显。符号版本之间的差异明显较小,以至于诱使错误的程度相对更大:“ x | y”不是“ x || y”,但是当嵌入较大的表达式中时,我们很多人错过差异。这类似于赋值与相等运算符的常见偶然混合。由于这个原因,我已经放弃了符号版本(这并不容易),而支持单词版本。由于我们对旧事物的热爱,我宁愿有人对他们采取双重行动,而不是诱使臭虫。


4
不幸的是,在Visual Studio(从VS2013开始)中,必须设置特定的编译器选项(/Za)以支持替代关键字(请参阅stackoverflow.com/a/555524/368896)。大概还有其他影响。因此,在Visual Studio中,采纳此建议不一定安全。
Dan Nissenbaum 2014年

FWIW /-当我在运算符周围放置空格时,x | y在视觉上与(在等距字体中)有足够的区别x || y,但是我确实发现!in if (!f(xyz) && ...容易比忽略if (not f(xyz) && ...
Tony Delroy 2015年

@Tony D当您在运算符周围放置空格时,这是您的私人约定,对读者而言并不明显。但是,使用自然语言的话想andornot在一个布尔表达式,实际上提高了可读性,再加上它突出了区别来位操作。因此,恕我直言,我们应该考虑将自己心爱的旧习惯改变为更好的方式
Ichthyo

@DanNissenbaum我在C / C ++>语言>禁用语言扩展的名称下找到了此选项,因此可以预期到副作用是相对安全的;)
Wolf

6
您是否知道由于字眼andor偏见使人们对它们应该如何工作的想法而引入了多少个Python错误?例如,if (a == b or c)而不是if (a == b || a == c)-这样的事情几乎每天都会在StackOverflow上弹出。与英语断开的抽象符号可减少这些错误。
Mark Ransom

10

在C ++中,它们是真实的关键字。在C中,它们是在中定义的宏<iso646.h>。参见http://web.archive.org/web/20120123073126/http://www.dinkumware.com/manuals/?manual=compleat&page=iso646.html


6
从技术上讲,它们是备用标记,而不是关键字。:)
GManNickG 2010年

2
@GMan:+1不错,不过,Dinkumware页面将它们称为关键字,因此,我想他们不太在意这种区别。
克里斯·杰斯特·杨


那么,MSVC是否在C ++中开箱即用地支持它们,而在C中不支持?
2015年

1
@rwst我不能特别评论MSVC,但是如果它忠实地实现了C ++和C标准,那么确实如此。另请参阅:stackoverflow.com/questions/2376448/…–
克里斯·杰斯特·杨

2

and并且&&在C ++中在功能上相同。在andor运营商是真正有效的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语句都将编译,但是最后一个if语句意味着完全不同且意外的东西!

如果您总是在使用and逻辑AND时使用,则绝不会意外输入单个“&”并使代码成功编译并以神秘的结果运行。

另一个好的练习:尝试不小心遗漏“ and”字符,然后看看会发生什么。;)


1
这并不是对这个问题的真正答案。只是您说自己的感觉更清晰。OP询问了书面版本如何工作,哪个更好。还有其他人已经指出了您要提出的观点。
Nicol Bolas

并不是说它确实提供了更多有用的信息,但是我将在答案中添加“ and并且&&在功能上是相同的” ...而且,如果您阅读我的答案,将会看到我说的不是易读性;)
tjwrona1992
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.