什么时候在C ++中引入了“和”或“或”替代令牌?

我刚刚从Reddit阅读这个好的一块 。

他们提及and正在or正在成为&&|| “替代令牌”

直到现在我才真正意识到这些。 当然,大家都知道di-graph和tri-graph ,但andor ? 从何时起? 这是最近添加到标准?

我刚刚使用Visual C ++ 2008进行了检查,似乎并没有将这些识别为语法错误以外的任何东西。 这是怎么回事?

只有当您使用/Za选项禁用扩展时,MSVC才将其作为关键字支持; 这至less从VC7.1(VS2003)是真实的。

你可以通过包含iso646.h来获得它们作为macros的支持。

我的猜测是他们认为,默认情况下关键字会打破现有的代码(如果他们是正确的,我不会感到惊讶)。

在几个星期前的某个地方,这个问题已经在讨论,但是我不能得到SO的search或Google来find这个该死的东西。

从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 & | 

要真正回答这个问题:

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

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

另类小学
 <%{
 %>}
 <:[
 :>]
 %:#
 %:%:##
和&&
 bitor |
或||
 xor ^
 compl〜
 bitand&
 and_eq&=
 or_eq | =
 xor_eq ^ =
不!
 not_eq!=

虽然老实说,我从来没有见过任何人用过,除了andor ,而not ,甚至那些,那些都是很less见的。 请注意,这些默认情况下不允许在纯C代码中使用,只能在C ++中使用。 如果你想在C中使用它们,你必须自己定义为macros,或者#include<iso646.h> ,它定义了除<% >% <: %: %:%:作为macros(参见C99标准的第7.9节)。

G ++有他们,但我不知道MS VC ++。

通过将它放在代码文件的顶部,可以获得相同的function。

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

虽然这有点怪异,但它应该起作用。

您可能会惊讶于了解其他人:

 and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq 

从C ++关键字列表。

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

虽然这个问题很古老,但我想提供一个或多或less的完整答案:替代令牌已经是当前撤回的C ++ 98的一部分( ISO / IEC 14882:1998 ,我相信它是第一个C ++的ISO标准)。 虽然本身并不是一个certificate(而且我没有拥有c ++ 98的ISO副本),但这里有一个链接 – 参见C ++部分。

正如其他答案中所提到的,当/ Za标志没有被指定时,MSVC编译器违反了标准的[lex.digraph]部分。

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