我只是写了一些代码来吐出一个波头。我开始输入:
file << 0x52 << 0x49 << 0x46 << 0x46 << ...
这让我思考:编译器如何区分将上述内容解释为:
file << 0x52; file << 0x49; file << 0x46; file << 0x46;
...还有这个:
file << (0x52 << 0x49 << 0x46 << 0x46);
当然,还有这些运算符的所有可能性的排列/组合。
我的猜测是编译器以某种方式知道第一个是正确的,第二个是错误的,但是它遵循什么规则?
最佳答案
C++ 中的运算符具有优先级和结合性。
表达式
a << b << c << d
被解释为(因为 <<
是左关联的)
((a << b) << c) << d
感谢 operator<<
对于流返回流本身,您会得到“链接输出”的外观。
例如,赋值运算符是右关联的,因此
a = b = c = d
被解释为
a = (b = (c = d))
请注意,关于使用 <<
流的运算符有一个微妙的事实,经常被 C++ 新手误解。优先级和关联性规则只会影响结果,但不会影响结果的计算顺序。例如在
std::cout << f() << g() << h();
有可能评估 h()
发生在 g()
评估之前。更糟糕的是,评估顺序的想法对于 C++ 来说是错误的……因为在
std::cout << f(g()) << h(i());
有效的调用顺序也是 i, g, f, h
.
关于c++ - C++ 编译器如何区分左移位/右移位和 ostream<</ostream>> 运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24850805/