This是我见过的and
,or
和not
唯一被列为C ++实际运算符的地方。当我在NetBeans中编写一个测试程序时,我得到了红色下划线,好像有一个语法错误,并认为该网站是错误的,但它是错误的NetBeans,因为它编译并按预期运行。
我可以看到!
比not
更受青睐,但and
&& or
似乎比他们的语法兄弟更重要。为什么这些版本的逻辑运算符存在,为什么看似没有人使用它?这是真正有效的C ++还是与语言中包含的C的某种兼容性?
答案 0 :(得分:99)
它们起源于标题<iso646.h>
中的C.当时存在无法键入&&
所需符号的键盘(例如),因此包含#define
的标题可以帮助他们这样做(在我们的示例中)将and
定义为&&
。当然,随着时间的推移,这种情况变得越来越少了。
在C ++中,它们变成了所谓的备用令牌。你不需要在兼容的编译器中包含任何使用这些标记的东西(因此,C标题的C ++ - ified版本<ciso646>
是空白的)。除了拼写之外,替代令牌就像常规令牌一样。因此,在解析and
时与<{1}}完全相同,这只是拼写相同内容的另一种方式。
至于它们的用途:因为它们很少使用,使用它们往往比它有用更令人惊讶和困惑。我确定它是否正常,它们会更容易阅读,但是人们已经习惯了&&
和&&
其他任何事情都会让人分心。
编辑:然而,自从我发布此内容后,我看到他们的使用量略有增加。我仍然避开它们。
答案 1 :(得分:15)
它们确实存在可用性(键盘/显示器风格中的字符支持)和一般可读性,但还有另一个原因,现在更加明显。几乎没有答案here,here,甚至主要答案here都说明了我们许多人更喜欢单词版本而非符号版本的核心原因(以及其他语言的主要原因)使用它们):错误。单词版本之间的差异非常明显。符号版本之间的差异明显不那么大,以至于在相对更大程度上诱惑错误:“x | y”非常不是“x || y”,但是当嵌入更大的表达式时我们很多人想念差异。它类似于赋值与等于运算符的常见意外混合。出于这个原因,我已经脱离了符号版本(这并不容易),而是支持单词版本。由于我们喜欢旧事物而不是诱惑虫,我宁愿让别人对它们进行双重拍摄。
答案 2 :(得分:10)
在C ++中,它们是真正的关键词。在C中,它们是<iso646.h>
中定义的宏。请参阅http://web.archive.org/web/20120123073126/http://www.dinkumware.com/manuals/?manual=compleat&page=iso646.html。
答案 3 :(得分:2)
and
和&&
在C ++中在功能上相同。 and
和or
运算符是真正有效的C ++,并且是语言标准的一部分。
要用一个具体示例详细说明其他答案,除了“可读性”之外,还有另一个原因更倾向于使用and
而不是&&
。当您要使用逻辑AND时,可以明确地拼写出“ 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”字符,然后看看会发生什么。 ;)
答案 4 :(得分:0)
尝试搜索此页面以了解逻辑运算符的用法。 &&
或 ||
很容易找到。另一方面,搜索 and
或 or
会产生很多误报。
符号版本也能更好地处理纯文本文件。如果 &&
出现在评论或文档中,我会立即认为作者指的是逻辑运算符。如果 and 出现在文档中,文本样式可能会告诉我这是什么意思。如果 和 出现在评论中...抱歉,文字识别并没有告诉我它在评论中的功能。
您是否看到最后一次使用 and
而没有文字样式的帮助?