You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移位运算符<<与按位与运算符&的优先级问题:代码编译失败原因咨询

移位运算符<<与按位与运算符&的优先级问题:代码编译失败原因咨询

你好呀!这个问题其实是对C++运算符优先级的记忆偏差导致的,咱们一步步捋清楚:

首先先看你给出的代码:

#include <iostream>
int main() { 
    unsigned long ul1 = 7, ul2 = 3; 
    std::cout << ul1 & ul2 << std::endl; 
    return 0; 
}

你提到编译器把表达式解析成了(std::cout << ul1) & (ul2 << std::endl),这其实完全符合C++的运算符优先级规则——你记错啦!移位运算符(<<、>>)的优先级是高于按位与运算符(&)的,并不是&比<<优先级高。

咱们拆解一下错误的解析过程:

  • 因为<<优先级更高,所以编译器会先处理最左边的std::cout << ul1,这部分返回的是std::ostream对象(也就是cout本身)
  • 接着处理右边的ul2 << std::endl,这里std::endl是一个函数指针类型,把unsigned long类型的ul2和函数指针做移位操作本身就是非法的,这直接触发了编译器的重载解析错误
  • 就算右边的移位能通过,左边的std::ostream对象和右边的结果做按位与运算也是没有定义的,编译器自然会抛出参数不匹配的错误

而当你给ul1 & ul2加上括号后,强制改变了运算顺序:先计算按位与的结果(7&3=3),然后依次执行std::cout << 3和<< std::endl,这完全符合ostream的运算符重载规则,所以代码就能正常编译运行了。

总结一下:核心问题是记错了运算符优先级,移位运算符的优先级比按位与高,所以编译器会优先处理<<操作,导致表达式被错误分组。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 07:55:27