"&&"和"和"运算符之间的区别

msc*_*msc 12 c++ logical-operators

我看到了其他运营商(如and,or,not等)浏览cppreference时.

他们是替代"正常"运营商如&&,||,!等.

我检查了程序集中使用&&和的代码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";
   }
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

  • &&and运营商有什么区别?
  • 在哪里,什么时候使用and&&
  • 如果不存在差异,那么为什么C++引入其他运营商(如and,or,not等等)?

Sto*_*ica 15

&&和运算符之间有什么区别?

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

我在何时何地使用和结束&&?

这在很大程度上是一个偏好问题.我太习惯&&不使用它了,但是如果有人发现and更具可读性,我就能理解.

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

C++旨在提供各种字符集和平台.像Bathsheba指出的Trigraphs是这种特征的另一个例子.如果一个字符集不允许&&被写入(例如,因为它根本没有&字符),那么人们仍然可以使用替代表示.如今,这在很大程度上没有实际意义.


1实际上,经过进一步思考,我对你的第一个问题的答案可以得到改进.稍微缺乏等效性,与如何解析令牌有关.&&不需要将空格解析为单独的标记,同时and也是如此.这意味着:

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

  if(b1andb2) { // ill formed, needs spaces around `and`
 }
}
Run Code Online (Sandbox Code Playgroud)

  • 它们出现在第一个C++标准中 - /sf/ask/297618961/但它们并不常见,以至于VS没有t默认启用它们 - /sf/ask/241379561/ (2认同)

Bat*_*eba 10

and,or,not,& C.是替代运营商的例子.

有关完整列表,请参阅http://en.cppreference.com/w/cpp/language/operator_alternative ; 开头段落是存在的理由:

C++(和C)源代码可以用包含ISO 646:1983不变字符集的任何非ASCII 7位字符集编写.但是,一些C++运算符和标点符号需要在ISO 646代码集之外的字符:{,},[,],#,\,^,|,〜.为了能够使用其中部分或全部符号不存在的字符编码(例如德国DIN 66003),C++定义了由ISO 646兼容字符组成的以下备选方案.

如果我是你,我会回避使用它们,就像你应该回避使用有向图和三角形一样,即使后者使面试变得有趣.

例如,Trigraphs明确地从C++ 17中停止.你可能会看到and&c.也被放弃在未来的标准中.

  • 那么,为了保护那些替代表示,它们是可读的.Trigraphs仅用于支​​持一些不再广泛使用的奇怪键盘. (2认同)