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
,你最终在输出流中同时得到 a
和 b
。
当你用括号改变顺序时,<<
的意思变成左移。
当您将第二个 <<
替换为 &
时,情况发生了变化,因为现在 precedence 开始变得重要了。 &
的优先级低于 <<
,所以
cout << a & b;
被解释为
(cout << a) & b;
此表达式需要一个运算符 &
,它在左侧采用输入流,在右侧采用整数。由于不存在该运算符,编译器报错
当您再次使用括号强制计算顺序时,编译器会看到您将 <<
应用于输出流和一个整数,因此它计算 (a&b)
,并将其写出到输出流。
编译器如何区分以下情况:
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
,你最终在输出流中同时得到 a
和 b
。
当你用括号改变顺序时,<<
的意思变成左移。
当您将第二个 <<
替换为 &
时,情况发生了变化,因为现在 precedence 开始变得重要了。 &
的优先级低于 <<
,所以
cout << a & b;
被解释为
(cout << a) & b;
此表达式需要一个运算符 &
,它在左侧采用输入流,在右侧采用整数。由于不存在该运算符,编译器报错
当您再次使用括号强制计算顺序时,编译器会看到您将 <<
应用于输出流和一个整数,因此它计算 (a&b)
,并将其写出到输出流。