2009-09-16 75 views
24

这里是一个非常简单的C++应用程序我QtCreator提出:或无效C++:为什么此代码编译?

int main(int argc, char *argv[]) 
{ 
    int a = 1; 
    int b = 2; 

    if (a < 1 or b > 3) 
    { 
     return 1; 
    } 
    return 0; 
} 

对我来说,这不是有效的C++,作为关键字不是保留关键字。

但是,如果我编译并运行它,它没有任何警告正常工作!退出码是0,如果我改变b = 4,退出码是1!

我不包括任何东西,以确保没有隐藏的定义。

这对我来说真的很奇怪。这是Qt定义的东西吗?我没有在文档中找到任何相关内容。

+0

疯狂!那么发现+1 – Justicle 2009-09-17 05:47:16

+15

你的意思是什么?或**是C++中的关键字。 – 2009-09-17 06:02:17

+0

@MichaelFoukarakis我认为*'well spotted' *表示*'为什么要编译这个代码?'*部分问题:有些编译器需要'#include '而有些则不需要。大多数(如果不是全部的话)IDE不会突出显示这些新的“关键字”。 – Wolf 2017-01-10 10:35:26

回答

54

根据Wikipedia

C++定义的关键字来充当用于多个符号的别名 发挥功能 由于运营商:和(& &),BITAND(&) and_eq(& =) (||),bitor(|)或or_eq (| =),xor(^),xor_eq(^ =),不是(!),not_eq(!=),compl(〜)。

作为MadKeithV points out,这些替换来自C的iso646.h,并作为运算符关键字包含在ISO C++中。维基百科关于iso646.h的文章说,这些关键字的原因确实适用于可能无法轻松访问这些符号的国际和其他非QWERTY键盘。

+2

酷 - 我从90年代初开始一直在编写C++,我对此一无所知。我不太可能会使用它,但很高兴知道。 – 2009-09-16 14:42:53

+0

我也不知道,直到我看了。使用起来似乎很尴尬,我确信有很多人在编写C++并且不知道它。 – 2009-09-16 15:02:45

+1

我相信这些被添加来帮助使用非英语键盘的人可能没有所有的符号键(&,|等)。 – KeithB 2009-09-16 15:27:22

16

or是一个C++关键字,您可以使用它而不是||。没有魔法。

and和大多数其他逻辑运算符也是如此。尽管如此,通常最好坚持使用众所周知的名称,以避免这样的混淆。如果你使用or,有人会想知道“为什么会这样编译”;)

+0

旧的答案,我知道,但我只是想变得很酷和迂腐的一点,他们不是关键字,而是替代令牌。男孩我觉得很酷挑剔和讨厌。 – GManNickG 2010-01-24 08:18:52

+0

哦对,我没有意识到这种区别。但是,看起来你是对的。 :) – jalf 2010-01-24 14:37:13

+0

@GManNickG:它们是关键字(至少在当前的工作草案中):第C.5.2.3节:“令牌和,和_eq,bitand,bitor,compl,not_eq,not或or_eq,xor和xor_eq是 这个国际标准(2.11)中的关键字,它们不是在中定义的宏名称。“ – Hannes 2016-04-22 11:57:42

7

iso646.h定义了一些操作符替代方案 - 它是C++标准的一部分。

+0

''在C++中为空。 – avakar 2009-09-16 15:13:31

+2

它不在Visual Studio 2003到2010(http://msdn.microsoft.com/en-us/library/bw6140c5%28VS.80%29.aspx) – 2009-09-16 15:24:51

+0

让我改述一下:文件是空的,就C++而言编译器有关。检查源代码,你会发现宏没有被定义为“__cplusplus”宏。 – avakar 2009-09-17 11:38:03