This code doesn't compile.
It seems like the compiler (VS) is interpreting the expression as:
(std::cout << ul1) & (ul2 << std::endl)
#include <iostream>
int main() {
unsigned long ul1 = 7, ul2 = 3;
std::cout << ul1 & ul2 << std::endl;
return 0;
}
Compiler errors:
error C2563: mismatch in formal parameter list
error C2568: '<<': unable to resolve function overload
When I explicitly parenthesize (ul1 & ul2)
, the code compiles.
Why does the compiler not respect the precedence of the &
operator being higher than the <<
operator?
In your case the usage of <<
corresponds to Bitwise left shift and right shift.
As you can see in the C++ Operator Precedence, it has higher precedence (number 7) than Bitwise AND (number 11) - which is used in ul1 & ul2
.
Therefore without using parenthesis ((ul1 & ul2)
), the 2nd half of the bitwise AND (&
) expression is interpreted as: ul2 << std::endl
, and an unsigned long
does not support shifting with std::endl
as an argument.
This is the cause of the compilation error you get.