或者是无效的C++:为什么这段代码会编译?

Jér*_*ôme 24 c++ or-operator

这是我用QtCreator创建的一个非常简单的C++应用程序:

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

    if (a < 1 or b > 3)
    {
       return 1;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Tho*_*ens 54

根据维基百科:

C++将关键字定义为充当运算符的多个符号的别名:和(&&),bitand(&),和_eq(&=),或(||),bitor(|),or_eq(| =), xor(^),xor_eq(^ =),not(!),not_eq(!=),compl(〜).

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

  • +1.IRC上的一些人有一天会这样做:`struct y {compl y(); };`:) (3认同)
  • 我实际上最近开始在某些地方使用<ciso646>(在C++程序中包含iso646.h的正确方法),尤其是单元测试.例如:`if(!someCondition)`看起来好像是`if(not someCondition)`因为有时候一眼就看出来了!在parens旁边迷路了. (3认同)
  • 酷 - 从90年代初开始我一直在编写C++,我对此一无所知.我不太可能_use_它,但很高兴知道. (2认同)

jal*_*alf 16

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

对于and大多数其他逻辑运算符也是如此.通常最好坚持使用众所周知的名字,以避免这样的混乱.如果你使用or,有人会想知道"为什么这个编译";)


Jor*_*ans 7

iso646.h定义了许多运算符替代 - 它是C++标准的一部分.

  • 它不在Visual Studio 2003到2010中(http://msdn.microsoft.com/en-us/library/bw6140c5%28VS.80%29.aspx) (2认同)