Cpp 错误中的 << 运算符

The << operator in Cpp error

编译器如何区分以下情况:

cout << a; //Case 1 :prints a

cout << a << b; // Case 2 :prints both a and b

cout << (a << b); // Case 3 :Left shifts a by b bits and prints shifted a

cout << a&b;   // Case 4 :Throws an ERROR

在大多数情况下,编译器会自行假设 << 和没有适当括号的 cout 总是用于 插入 输出流。但为什么在最后一种情况下它会失败,IMO:这应该正确给出按位 b 的答案。如果我做包围,它确实给出了正确的:

cout<< (a&b);  //gives correct output of bitwise and a , b.

为什么会出现第4种情况?

<< 运算符链的计算从左到右进行。因此,

cout << a << b;

相同
(cout << a) << b;

因为 cout << a 表达式 returns cout,你最终在输出流中同时得到 ab

当你用括号改变顺序时,<<的意思变成左移。

当您将第二个 << 替换为 & 时,情况发生了变化,因为现在 precedence 开始变得重要了。 & 的优先级低于 <<,所以

cout << a & b;

被解释为

(cout << a) & b;

此表达式需要一个运算符 &,它在左侧采用输入流,在右侧采用整数。由于不存在该运算符,编译器报错

当您再次使用括号强制计算顺序时,编译器会看到您将 << 应用于输出流和一个整数,因此它计算 (a&b),并将其写出到输出流。