我刚刚读了Reddit上这篇 不错的文章。
他们提到and
和or
是替代方式
分别对应于&&
和||
直到现在我才真正知道这些,当然,每个人都知道双字母图形和三字母图形,但是and
和or
呢?从什么时候开始有的?这是标准的最新补充吗?
我刚刚用Visual C++ 2008检查了一下,它似乎不认识这些东西,而将其视为语法错误。发生了什么事?
我刚刚读了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
,您可以将它们支持为宏。
我猜他们认为默认情况下将它们设为关键字会破坏太多现有的代码(如果他们是对的,我也不会感到惊讶)。
and
,而 C 从一开始就具备了这个特性,所以 Python 酷了 50 倍。 - bobobobo#include <ciso646>
,这似乎有点令人沮丧。毫不奇怪,g++支持它们,因为它们是标准的一部分。 - Jonathan Mee替代主要 <% { %> } <: [ :> ] %: # %:%: ## and && bitor | or || xor ^ compl ~ bitand & and_eq &= or_eq |= xor_eq ^= not ! not_eq !=但老实说,我从来没有看到过除了
and
、or
和not
之外的任何一个被使用过,即使是这些也很少见。请注意,这些默认情况下在普通的C代码中是不允许的,只有在C++中才可以。如果您想在C中使用它们,您必须自己将它们定义为宏,或者#include
头文件<iso646.h>
,该头文件定义了上述所有内容的宏,除了<%
>%
<:
:>
%:
%:%:
(请参见C99标准第7.9节)。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 !=
虽然这有点粗糙,但应该可以工作。
你可能会惊讶地了解到它们的其他部分:
and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq
从C++关键字列表中获取。
我相信最近的GCC版本支持这些关键字。