逻辑运算符的书面版本

def*_*alt 86 c++ language-features logical-operators

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

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

GMa*_*ckG 100

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

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

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

编辑:然而,自从我发布此内容后,我看到他们的使用量略有增加.我仍然避开它们.

  • 我个人认为他们好多了......但后来我对Python有偏见.我不知道为什么有些人认为如果它不是乱码就不是代码...... (14认同)
  • @Kavon:它在标准的第 2.5 节中指定;这是一个语言功能。 (2认同)

mr3*_*mr3 17

它们确实存在可用性(键盘/显示器口味中的字符支持)和一般可读性,但还有另一个原因,现在更加明显.这里,这里的答案几乎都没有,甚至这里的主要答案没有说明我们许多人更喜欢单词版本而非符号版本的核心原因(以及其他语言使用它们的主要原因):错误.单词版本之间的差异非常明显.符号版本之间的差异明显不那么大,以至于在相对更大程度上诱惑错误:"x | y"非常不是"x || y",但是当嵌入更大的表达式时我们很多人想念差异.它类似于赋值与等于运算符的常见意外混合.出于这个原因,我已经脱离了符号版本(这并不容易),而是支持单词版本.由于我们喜欢旧事物而不是诱惑虫,我宁愿让别人对它们进行双重拍摄.

  • 你知道引入了多少Python漏洞,因为"和"和"或"这些词会让人们思考它们应该如何工作?例如`if(a == b或c)`而不是`if(a == b || a == c)` - 这样的事情几乎每天都会出现在StackOverflow上.与英语语言断开连接的抽象符号可以减少这些错误. (5认同)
  • 不幸的是,在Visual Studio中(从VS2013开始),您必须设置特定的编译器选项(`/ Za`)以支持备选关键字(请参阅http://stackoverflow.com/a/555524/368896).这可能还有其他影响.因此,在Visual Studio中,采用此建议并不一定安全. (3认同)

Chr*_*ung 10

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

  • 从技术上讲,它们是替代标记,而不是关键字.:) (5认同)
  • 此链接现在无效. (3认同)
  • @GMan:+1很好的电话,但Dinkumware页面称它们为关键字,所以,我想他们并不太关心这种区别. (2认同)

tjw*_*992 6

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

为了用具体的例子来详细说明其他答案,除了“可读性”之外,还有另一个原因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;
}
Run Code Online (Sandbox Code Playgroud)

所有三个 if 语句都会编译,但最后一个语句的含义完全不同并且是意想不到的!

如果您总是在表示逻辑 AND 时使用and,则永远不会意外地键入单个“&”,并使代码成功编译并运行并产生神秘的结果。

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

  • 这并不是问题的真正答案。只是您陈述了您认为更清晰的内容。OP询问书面版本如何工作,而不是哪个版本更好。[其他人](/sf/answers/1444965441/)已经提出了与您相同的观点。 (2认同)