105

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

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

4

5 回答 5

125

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

在 C++ 中,它们变成了所谓的替代标记。您无需包含任何内容即可在兼容的编译器中使用这些标记(因此,C 标头的 C++ 化版本<ciso646>, 是空白的)。替代标记就像常规标记一样,除了拼写。所以在解析and过程中和 完全一样&&,只是同一个东西的拼写方式不同而已。

至于它们的用途:因为它们很少使用,所以使用它们往往比它有用更令人惊讶和困惑。我敢肯定,如果它是正常的,它们会更容易阅读,但人们已经习惯了&&||其他任何事情都会让人分心。

编辑:但是,自从我发布此内容以来,我发现它们的使用量略有增加。我还是避开他们。

于 2010-03-04T02:11:56.780 回答
23

它们确实存在于可用性(键盘/显示器风格中的字符支持)和一般可读性,但还有另一个原因,现在更加明显。这里几乎没有答案,这里,甚至这里的主要答案说明我们中的许多人更喜欢单词版本而不是符号版本的核心原因(以及其他语言使用它们的主要原因):错误。单词版本之间的差异非常明显。符号版本之间的差异明显较小,以至于在更大程度上引起了 bug错过差异。它类似于赋值与相等运算符的常见意外混合。出于这个原因,我已经放弃了符号版本(这并不容易),转而支持单词版本。由于我们对旧事物的热爱,我宁愿有人对它们进行双重处理,而不是引诱虫子。

于 2013-12-17T18:54:27.200 回答
10

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

于 2010-03-04T02:12:04.700 回答
4

and并且&&在 C++ 中功能相同。andand运算符是真正有效的orC++ 和语言标准的一部分。

为了用一个具体的例子详细说明其他答案,除了“可读性”之外,还有另一个原因更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在你的意思是逻辑 AND 时使用,你永远不会不小心输入一个“&”并让你的代码成功编译并以神秘的结果运行。

另一个很好的练习:试着不小心去掉“and”这个字符,看看会发生什么。;)

于 2019-01-14T16:24:51.347 回答
2

尝试搜索此页面以了解逻辑运算符的用法。 &&或者||很容易找到。另一方面,搜索andoror会给出很多误报。

符号版本也可以更好地处理纯文本文件。如果&&出现在评论或文档中,我立即意识到作者的意思是逻辑运算符。如果and出现在文档中,文本样式可能会告诉我是什么意思。如果 and 出现在评论中......抱歉,单词识别并没有告诉我它在评论中的功能。

你有没有看到最后一次使用and,没有文本样式的帮助?

于 2021-06-25T17:45:39.140 回答