【问题标题】:Difference between "&&" and "and" operators [duplicate]“&&”和“and”运算符之间的区别[重复]
【发布时间】:2017-11-08 08:35:27
【问题描述】:

我在浏览 cppreference 时看到了alternative operators(如andornot 等)。

它们是 &&||! 等“普通”运算符的替代品。

我检查了使用&&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";
   }
}

所以我的问题是:

  • &amp;&amp;and 运算符有什么区别?
  • 我应该在何时何地使用and 而不是&amp;&amp;
  • 如果没有区别,那为什么 C++ 会引入替代运算符(如andornot 等)?

【问题讨论】:

标签: c++ logical-operators


【解决方案1】:

&& 和 and 运算符有什么区别?

没有1。这些运算符的“替代”方面意味着它们可用于从语义角度构造完全相同的表达式。

我应该在何时何地使用 &&?

这在很大程度上是一个偏好问题。我太习惯了&amp;&amp; 不使用它,但如果有人觉得and 更具可读性,我可以理解。

为什么 C++ 会引入替代运算符?

C++ 被设计用于各种字符集和平台。就像 Bathsheba 指出的那样,三合符是这种特征的另一个例子。如果一个字符集不允许写入&amp;&amp;(比如说,因为它根本没有 & 字符),那么仍然可以使用替代表示。如今,它基本上没有实际意义。


1 其实,经过进一步思考,我对你第一个问题的回答是可以细化的。关于如何解析令牌,稍微缺乏等价性。 &amp;&amp; 不需要将空格解析为单独的标记,而 and 则需要。这意味着:

void foo(bool b1, bool b2) {
  if(b1&&b2) { // Well formed
  }

  if(b1andb2) { // ill formed, needs spaces around `and`
 }
}

【讨论】:

【解决方案2】:

andornot 等。是替代运算符的示例。

完整列表见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。在未来的标准中也将被删除。

【讨论】:

  • 好吧,为了保护那些替代表示,它们是可读的。 Trigraphs 的出现只是为了支持一些不再广泛使用的奇怪键盘。
  • @StoryTeller:你也可以对一些运营商说同样的话,例如^。
  • 嗯,是的。但我觉得将它们与三元组进行比较至少也应该从历史的角度来看
  • 今年愚人节来临之际,我知道我要发送什么进行代码审查。希望我能保住我的工作......
猜你喜欢
  • 2011-09-11
  • 2010-12-30
  • 2022-01-19
  • 1970-01-01
  • 2013-05-16
  • 2011-05-29
  • 2014-03-28
  • 2021-12-18
相关资源
最近更新 更多