这是我不小心写的代码:
int bar = 5;
int foo = bar << '\n';
int cnt = 0;
for (int i = 0; i < foo; i++) {
cnt++;
}
cout << cnt << '\n';
为什么cnt
给出输出5120
。我希望那是编译错误。
答案 0 :(得分:5)
好吧,'\n'
是char
,它只是数字的另一种类型,<<
(尽管我们经常看到它以重载形式出现在流中)是头等重要的一个“左移”运算符,可以处理两个数字。
因此,您有数字bar
(或5)和数字'\n'
(或假设ASCII为10)。它们是二进制补码的样子:
0000 0000 0000 0101 (5)
^^ ^^^^ ^^^^
ten bits
您将5左移10位,这给您...
0001 0100 0000 0000
^^ ^^^^ ^^^^
ten bits
…或5120。
顺便说一句,您可以只打印foo
的值,而不用循环构建cnt
。
当您看到someStream << '\n'
并执行了完全不同的操作时,这是因为someStream
是重载运算符<<
的类的实例在这种情况下的新含义。是的,这有点令人困惑。
答案 1 :(得分:1)
int foo = bar << '\n';
表示移动小节数值5,该数值位于二进制0101'\ n'位的左边。解释为int时,'\ n'为10。
答案 2 :(得分:1)
<<是整数的移位运算符。它将位向左移动。基本上,它乘以2 ^ x。
单引号中的\ n是一个字符。字符就像整数,可以在算术运算中使用。