C++中cout处理bool与int的规则及运算符优先级疑问
问题解答
核心诱因:运算符优先级差异
该现象完全由C运算符优先级规则导致,和cout的operator<<本身的输出特性无关:
C中左移运算符<<的优先级远高于逻辑与运算符&&,因此代码行cout << a && true ;会被编译器解析为等价于(cout << a) && true;的执行逻辑:
- 先执行
cout << a,直接输出整数8,该表达式的返回值为cout流对象本身 - 后续用返回的流对象和
true执行逻辑与运算:流对象会隐式转换为bool类型(输出成功时为true),最终运算结果为true,但该结果没有被任何输出语句接收,直接被丢弃
第二行输出逻辑说明
cout << typeid(a && true).name();中,a && true是独立的逻辑运算表达式,逻辑与运算的返回值固定为bool类型,因此typeid返回的类型名称为bool,输出后拼接前面的8,最终得到你观测到的8bool结果。
布尔值输出疑问解答
你预期的true或1没有输出,本质是a && true的运算结果根本没有被传入operator<<,不是cout的输出特性导致的:
- 如果要输出
a && true的运算结果,需要手动加括号提升运算优先级:cout << (a && true);,此时会输出1(cout默认将bool类型值转为整数输出) - 如果要输出
true/false格式的布尔字符串,需要先开启布尔值格式化配置:
cout << boolalpha << (a && true); // 执行后输出为 true
内容的提问来源于stack exchange,提问作者Nusrat Nuriyev
相关产品推荐
相关产品推荐

