在C++中引入'和'和'或'替代令牌是什么时候?

sho*_*osh 37 c++ syntax keyword digraphs trigraphs

我刚读过Reddit的这篇精彩文章.

他们提到and,并or成为"替代令牌",以&&||

到目前为止我真的没有意识到这些.当然,每个人都知道的二图和三图表,但andor?从何时起?这是标准的最新成员吗?

我刚刚使用Visual C++ 2008进行了检查,它似乎并没有将这些视为语法错误.这是怎么回事?

pax*_*blo 32

从C++ 11标准来看,2.6/ Alternative tokens:

  1. 为某些运营商和标点符号提供了替代令牌表示.
  2. 在语言的所有方面,除了拼写之外,每个备选令牌的行为分别与其主令牌相同.表2中定义了替代令牌集.

表2 - 替代代币

alternative primary | alternative primary | alternative primary
--------------------+---------------------+--------------------
   <%          {    |    and         &&   |    and_eq      &=
   %>          }    |    bitor       |    |    or_eq       |=
   <:          [    |    or          ||   |    xor_eq      ^=
   :>          ]    |    xor         ^    |    not         !
   %:          #    |    compl       ~    |    not_eq      !=
   %:%:        ##   |    bitand      &    |
Run Code Online (Sandbox Code Playgroud)


Mic*_*urr 23

仅当您使用/Za禁用扩展的选项时,MSVC才支持它们作为关键字; 这至少从VC7.1(VS2003)开始.

您可以通过包含来支持它们作为宏iso646.h.

我的猜测是他们认为默认情况下将它们设为关键字会破坏现有代码(如果它们是正确的话我也不会感到惊讶).

几个星期前在这里的一个问题上讨论了这个问题,但是我无法通过SO的搜索或谷歌找到该死的东西.

  • 所以Python是50倍酷,因为你可以写`和`,而C一直都是这个功能. (2认同)
  • 我发现这个链接看似相关.错误描述"Visual C++ 2012编译器和iso646.h在逻辑运算符的替代令牌的使用方面不符合C++ 11标准"状态已关闭为延迟.https://connect.microsoft.com/VisualStudio/feedback/details/751912/alternative-tokens-for-logical-operators-c-11 (2认同)

Mar*_*ica 10

要真正回答这个问题:

它们是在第一个C++标准中定义的.


Ada*_*eld 5

请参阅 C++ 标准。委员会草案#2 可在以下网址免费获得ftp://ftp.research.att.com/dist/c++std/WP/CD2/body.pdf,虽然它是非权威的、过时的,并且在一些地方部分不正确。具体来说,在第 2.5 节“替代令牌”中,定义了以下内容:

替代小学
<%{
%> }
<: [
:>]
%:#
%:%:##
和 &&
比特|
或 ||
异或^
补~
位元&
and_eq &=
or_eq |=
xor_eq ^=
不是 !
not_eq !=

尽管老实说,除了andor、 和之外,我从未见过它们中的任何一个not,即使如此,这些也很少见。请注意,默认情况下,这些在普通 C 代码中是不允许的,仅在 C++ 中是允许的。如果您想在 C 中使用它们,您必须#define自己将它们作为宏,或者#includeheader <iso646.h>,它定义了上述所有内容,除了<% >% <: :> %: %:%:作为宏(参见 C99 标准的第 7.9 节)。

  • 如果您包含 &lt;iso646.h&gt; 并且自 1994 年以来,它们在 C 中是允许的。 (2认同)