在浏览cppreference时,我看到了其他运算符(如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 positiven";
}
}
所以我的问题是:
&&
和and
运算符之间有什么区别- 何时何地使用
and
而不是&&
- 如果没有区别,那么C++为什么要引入替代运算符(如
and
、or
、not
等)
&和运营商?
没有1。这些运算符的"替代"方面意味着它们可以用于从语义角度构建完全相同的表达式。
何时何地使用and over&;?
这在很大程度上是一个偏好问题。我太习惯&&
了,不能不使用它,但如果有人觉得and
更可读,我可以理解。
为什么C++引入替代运算符?
C++设计用于各种字符集和平台。正如巴斯谢巴所指出的,三角图就是这种特征的另一个例子。如果一个字符集不允许写入&&
(比如说,因为它根本没有&字符),那么仍然可以使用替代表示。如今,这在很大程度上是没有意义的。
1事实上,经过进一步思考,我对你第一个问题的回答可以改进。在如何解析令牌方面,稍微缺乏等价性。&&
不需要将空间解析为单独的令牌,而and
需要。这意味着:
void foo(bool b1, bool b2) {
if(b1&&b2) { // Well formed
}
if(b1andb2) { // ill formed, needs spaces around `and`
}
}
and
、or
、not
和;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兼容字符组成的备选方案。
如果我是你,我会回避使用它们,就像你应该回避使用有向图和三角图一样,即使后者让面试变得有趣。
例如,从C++17中明确地中断了三角图。您可能会看到and
&c.在未来的标准中也被删除。