我刚读过Reddit的这个nice piece。
他们提到and
和or
是&&
和||
and
和or
?从何时起?这是标准的最新成员吗?
我刚刚使用Visual C ++ 2008进行了检查,它似乎并没有将这些视为语法错误。发生了什么事?
答案 0 :(得分:31)
从C ++ 11标准2.6/ Alternative tokens
:
表2 - 替代令牌
alternative primary | alternative primary | alternative primary
--------------------+---------------------+--------------------
<% { | and && | and_eq &=
%> } | bitor | | or_eq |=
<: [ | or || | xor_eq ^=
:> ] | xor ^ | not !
%: # | compl ~ | not_eq !=
%:%: ## | bitand & |
答案 1 :(得分:23)
仅当您使用/Za
选项禁用扩展程序时,MSVC才支持它们作为关键字;这至少从VC7.1(VS2003)开始。
您可以通过加入iso646.h
来支持它们作为宏。
我的猜测是他们认为默认情况下将它们设为关键字会破坏现有代码(如果它们是正确的话我也不会感到惊讶)。
几个星期前在这里的一个问题上讨论了这个问题,但是我无法通过SO的搜索或谷歌找到该死的东西。
答案 2 :(得分:10)
要真正回答这个问题:
它们是在第一个C ++标准中定义的。
答案 3 :(得分:4)
参见C ++标准。委员会草案#2可以在 ftp://ftp.research.att.com/dist/c++std/WP/CD2/body.pdf免费获取,虽然它在一些地方是非权威的,过时的,部分不正确的。具体来说,在第2.5节替代标记中,定义了以下内容:
Alternative Primary <% { %> } <: [ :> ] %: # %:%: ## and && bitor | or || xor ^ compl ~ bitand & and_eq &= or_eq |= xor_eq ^= not ! not_eq !=
虽然老实说,除了and
,or
和not
之外,我从未见过任何使用它们,即便如此,这些也很少见。请注意,默认情况下,这些在纯C代码中是不允许的,仅在C ++中。如果你想在C中使用它们,你必须自己#define
将它们作为宏,或#include
标题<iso646.h>
,它定义了上述所有内容,但{{1}除外} <%
>%
<:
:>
%:
作为宏(请参阅C99标准的第7.9节)。
答案 4 :(得分:0)
您可能会惊讶地了解其余部分:
and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq
从C++ Keywords列出。
我相信GCC的最新版本支持这些关键字。
答案 5 :(得分:0)
G ++有它们,但我不知道MS VC ++。
您可以将它放在代码文件的顶部来获得相同的功能。
#define and &&
#define bitor |
#define or ||
#define xor ^
#define compl ~
#define bitand &
#define and_eq &=
#define or_eq ^=
#define xor_eq ^=
#define ! not
#define not_eq !=
虽然这有点像hackish,但它应该有用。
答案 6 :(得分:0)
虽然这个问题很老,但我想提供或多或少的完整答案: 替代令牌已经是当前撤回的C ++ 98(ISO/IEC 14882:1998的一部分,我相信这是C ++的第一个ISO标准)。 虽然本身不是证明(我不拥有c ++ 98的ISO副本),here's a link - see C++ section.
正如其他答案所述,当未指定 / Za 标志时,MSVC编译器违反了标准的 [lex.digraph] 部分。
答案 7 :(得分:-1)
它们出现在新C ++标准的工作文件中,第14页: C++ Standard