我刚刚从 Reddit读到这篇不错的文章。
他们提到and
并or
成为“替代代币&&
”||
直到现在我才真正意识到这些。当然,每个人都知道二合图和三合图,但是and
和or
?从何时起?这是该标准的最新补充吗?
我刚刚用 Visual C++ 2008 对其进行了检查,它似乎没有将这些识别为语法错误之外的任何东西。这是怎么回事?
从第一个ISO C++ 标准开始C++98
,这在中有所描述2.5/ Alternative tokens [lex.digraph]
:
Table 2 - Alternative tokens
alternative primary | alternative primary | alternative primary
--------------------+---------------------+--------------------
<% { | and && | and_eq &=
%> } | bitor | | or_eq |=
<: [ | or || | xor_eq ^=
:> ] | xor ^ | not !
%: # | compl ~ | not_eq !=
%:%: ## | bitand & |
因此,从 C++ 标准化过程的早期开始,它就一直存在。很少有人知道它的原因可能是因为主要用例是针对在不一定可用完整字符集的环境中操作的人。例如(这让我记忆犹新),IBM 大型机上的基线 EBCDIC 字符集没有方括号字符[
和]
.
/Za
仅当您使用禁用扩展的选项时,MSVC 才支持将它们作为关键字;至少从 VC7.1 (VS2003) 开始是这样。
您可以通过包含iso646.h
.
我的猜测是,他们认为默认将它们设为关键字会破坏太多现有代码(如果它们是正确的,我不会感到惊讶)。
要真正回答这个问题:
它们是在第一个 C++ 标准中定义的。
请参阅 C++ 标准。委员会草案 #2 可在以下网址免费获得ftp://ftp.research.att.com/dist/c++std/WP/CD2/body.pdf,虽然它是非权威的、过时的并且在一些地方部分不正确。具体来说,在第 2.5 节,替代令牌中,定义了以下内容:
替代小学 <%{ %> } <:[ :> ] %:# %:%: ## 和 && 比特| 或 || 异或^ 编译~ 比特和 and_eq &= or_eq |= xor_eq ^= 不是 ! not_eq !=
and
虽然老实说,除了、or
和之外,我从未见过使用过它们中的任何一个not
,即便如此,这些也很少见。请注意,这些默认情况下在纯 C 代码中是不允许的,仅在 C++ 中。如果您想在 C 中使用它们,您必须#define
自己将它们用作宏,或者将其定义为除宏之外的所有上述内容#include
的 header (请参阅 C99 标准的第 7.9 节)。<iso646.h>
<%
>%
<:
:>
%:
%:%:
虽然问题很老,但我想为它提供或多或少的完整答案:替代令牌已经是当前撤回的 C++98 的一部分(ISO/IEC 14882:1998,我相信这是第一个C++ 的 ISO 标准)。虽然本身不是证明(而且我没有 c++98 的 ISO 副本),但这里有一个链接 - 请参阅 C++ 部分。
如其他答案中所述,MSVC 编译器在未指定/Za标志时违反了标准的[lex.digraph]部分。
您可能会惊讶地了解其中的其余部分:
and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq
C++ 关键字列表。
我相信最新版本的 GCC 支持这些关键字。
GNU 编译器 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 !=
虽然这有点骇人听闻,但它应该可以工作。
它们位于新 C++ 标准的工作文件中,第 14 页: C++ 标准