“&&”之间的区别和“和”运算符

时间:2017-11-08 08:35:27

标签: c++ logical-operators

我在浏览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";
   }
}

所以我的问题是:

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

2 个答案:

答案 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)

andornot,&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。也被放弃在未来的标准中。