我在浏览cppreference时看到alternative operators(如and
,or
,not
等)。
它们是&&
,||
,!
等“普通”运营商的替代品。
我检查了程序集中使用&&
和and
的代码。两个版本都生成了相同的程序集。
代码:
#include <iostream>
int n = 1;
int main()
{
// if(n > 0 && n < 5)
if(n > 0 and n < 5)
{
std::cout << "n is small and positive\n";
}
}
所以我的问题是:
&&
和and
运营商之间有什么区别?and
而不是&&
?and
,or
,not
等)?答案 0 :(得分:15)
&amp;&amp;和&amp;和运营商?
没有 1 。这些运算符的“替代”方面意味着它们可以用于从语义角度构造完全相同的表达式。
我何时何地使用以及何时使用&amp;&amp;?
这主要是一个偏好问题。我已经习惯&&
不使用它,但可以理解是否有人发现and
更具可读性。
为什么C ++会引入替代运算符?
C ++旨在提供各种字符集和平台。像Bathsheba指出的Trigraphs是这种特征的另一个例子。如果一个字符集不允许写&&
(比如因为它根本没有&amp;字符),那么人们仍然可以使用替代表示。如今,这在很大程度上没有实际意义。
<子>
1 实际上,经过进一步思考,我对你的第一个问题的答案可以得到改进。稍微缺乏等效性,与如何解析令牌有关。 &&
不需要将空格解析为单独的标记,而and
则需要空格。这意味着:
void foo(bool b1, bool b2) {
if(b1&&b2) { // Well formed
}
if(b1andb2) { // ill formed, needs spaces around `and`
}
}
答案 1 :(得分:10)
and
,or
,not
,&amp; c。是替代运算符的示例。
有关完整列表,请参阅http://en.cppreference.com/w/cpp/language/operator_alternative;开头段落是存在理由:
C ++(和C)源代码可以用任何非ASCII 7位编写 包含ISO 646:1983不变字符集的字符集。 但是,一些C ++运算符和标点符号需要字符 超出ISO 646代码集:{,},[,],#,\,^,|,〜。成为 能够使用这些符号中的一些或全部所做的字符编码 不存在(如德国DIN 66003),C ++定义如下 替代品由ISO 646兼容字符组成。
如果我是你,我会回避使用它们,就像你应该回避使用有向图和三字符一样,即使后者使面试变得有趣。
例如,Trigraphs明确地从C ++ 17中停止。您可能会看到and
&amp; c。也被放弃在未来的标准中。