c++ - C++ 编译器如何区分左移位/右移位和 ostream<</ostream>> 运算符?

标签 c++ compiler-construction operators ostream

我只是写了一些代码来吐出一个波头。我开始输入:

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/

相关文章:

c - 在C中,具有相同内容的字符串总是存储在相同的内存中?

operators - 模数 (%) 在编程中的实际用途是什么?

c++ - 移位运算符、位运算符和 sizeof 运算符产生的结果的值类别是什么?

c++ - 删除C++中的悬挂指针

javascript - 在没有任何 PHP 的情况下刷新 HTML 中的 div?

c++ - 为什么析构函数总是声明为虚拟的

c++ - 使用掩码评估 uint512 的位

c++ - 使用静态库比包含头文件有什么好处?

vb.net - Visual Basic 编译器无法从以下错误中恢复 : System Error &Hc0000005& (Visual Basic internal compiler error)

c++ - 程序如何映射到计算机的内存和操作?