C++中的'and'和'or'替代符号是何时引入的?

44

我刚刚读了Reddit上这篇 不错的文章

他们提到andor替代方式分别对应于&&||

直到现在我才真正知道这些,当然,每个人都知道双字母图形和三字母图形,但是andor呢?从什么时候开始有的?这是标准的最新补充吗?

我刚刚用Visual C++ 2008检查了一下,它似乎不认识这些东西,而将其视为语法错误。发生了什么事?


1
我喜欢七年后,仍然没有一个答案真正回答了这个问题。哈哈 - Lightness Races in Orbit
1
有时候我觉得并不重要,只要能回答 Google 搜索就可以了。;-) - Ciro Santilli OurBigBook.com
1
我现在添加了一个回答,回答了这个问题! - Martin Bonner supports Monica
1
实际上,@MartinBonner比被选中的答案更精确地回答了你的问题。 - Sergey.quixoticaxis.Ivanov
我刚刚注意到这些是在VS2017中的...不知道它们是否在以前的版本中存在。 - Jonathan Mee
8个回答

37

根据第一个ISO C++标准 C++98,在2.5/ Alternative tokens [lex.digraph]中描述了以下内容:


  1. 针对某些运算符和标点符号提供了备用的记号表示法。
  2. 就语言的所有方面而言,每个备用记号在其拼写以外的情况下都与其主要记号表现相同。备用记号的集合在Table 2中定义。
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字符集没有方括号字符[]


24

如果您使用/Za选项禁用扩展,MSVC仅支持它们作为关键字;至少从VC7.1(VS2003)开始如此。

通过包含iso646.h,您可以将它们支持为宏。

我猜他们认为默认情况下将它们设为关键字会破坏太多现有的代码(如果他们是对的,我也不会感到惊讶)。


4
Python 很酷的原因之一是你可以使用 and,而 C 从一开始就具备了这个特性,所以 Python 酷了 50 倍。 - bobobobo
@bobobobo 在 Visual Studio 中,我们必须在每个想要使用这些关键字的地方都要 #include <ciso646>,这似乎有点令人沮丧。毫不奇怪,g++支持它们,因为它们是标准的一部分。 - Jonathan Mee
注意:Visual Studio 2019将它们识别为关键字 - 我不需要包含任何额外的头文件。 - Dwayne Robinson

14
为了真正回答这个问题:
它们是在第一个C++标准中定义的。

5
请参阅C++标准。委员会草案#2可在ftp://ftp.research.att.com/dist/c++std/WP/CD2/body.pdf免费获取,尽管它不是权威的、过时的,并且在一些地方部分不正确。具体来说,在第2.5节“替代符号”中定义了以下内容:
替代主要
<%          {
%>          }
<:          [
:>          ]
%:          #
%:%:        ##
and         &&
bitor       |
or          ||
xor         ^
compl       ~
bitand      &
and_eq      &=
or_eq       |=
xor_eq      ^=
not         !
not_eq      !=
但老实说,我从来没有看到过除了andornot之外的任何一个被使用过,即使是这些也很少见。请注意,这些默认情况下在普通的C代码中是不允许的,只有在C++中才可以。如果您想在C中使用它们,您必须自己将它们定义为宏,或者#include头文件<iso646.h>,该头文件定义了上述所有内容的宏,除了<% >% <: :> %: %:%:(请参见C99标准第7.9节)。

4
如果在 C 语言中包括 <iso646.h>,则可以使用它们,自 1994 年以来就一直如此。 - Jonathan Leffler

2
尽管这个问题很老,但我想提供一个更或多或少完整的答案:替代令牌已经是当前被撤回的C++98(ISO/IEC 14882:1998)的一部分,我相信这是C++的第一个ISO标准。虽然这本身不是证据(我没有c++98的ISO副本),但这里有一个链接-请参见C++章节。 如其他答案中所提到的,当未指定/Za标志时,MSVC编译器违反了标准的[lex.digraph]部分。

1

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 !=

虽然这有点粗糙,但应该可以工作。


2
如果您的实现支持,可以包含<iso646.h>(我认为大多数都支持)。 - Michael Burr
6
或者如果您使用C ++,则返回已翻译的文本。 - Zack The Human

1

你可能会惊讶地了解到它们的其他部分:

and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq

C++关键字列表中获取。

我相信最近的GCC版本支持这些关键字。


我几乎不会称它们为新的。它们不是在最初的C++标准中吗? - Rob Kennedy
好的,它们已经超过十年了,我会删除“新”的这个词。 :) - Greg Hewgill

-1

它们在新的C++标准工作文件中,第14页: C++标准


7
自1998年起,它们已经成为C++标准的一部分。 - Michael Burr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接