C ++中的三元运算符奇怪的行为
Posted
技术标签:
【中文标题】C ++中的三元运算符奇怪的行为【英文标题】:Ternery operator in C++ strange behavior 【发布时间】:2014-11-06 06:08:54 【问题描述】:一般原型: exp1?exp2:exp3
三元运算符的返回类型为 exp2。 exp3 必须具有与 exp2 相同的返回类型或至少具有隐式转换。否则会报错
在下面的程序中,由于 exp3 是 int 而 exp2 是 char*,我在 CodeBlocks 中遇到了预期的错误。 Bjut 当我用 0 替换 1 时,它正在打印 0..
0也是int值,看不懂。
#include <iostream>
using namespace std;
int main()
int test = 0;
cout << test ? "A String" : 1;
return 0;
【问题讨论】:
0 被隐式转换为空指针,或者按照标准的说法,0
是一个空指针常量。
注意这里打印的0
不是表达式右边的0
,而是test
的值。三元表达式的值被丢弃。
谢谢...是的,你是对的..0 是一个空指针常量..
【参考方案1】:
三元运算符的优先级很低。唯一具有较低优先级的运算符是逗号运算符。因此,您的表达式被解释为
(std::cout << test) ? "A String": 1;
这可能不是你想要的。但是,您的问题实际上是关于两个表达式之间的区别:
表达式
expr? "A String": 1
不起作用,因为字符串文字(即char const(&)[9]
类型)和整数文字(即int
类型)之间没有通用类型。
表达式
expr? "A String": 0
之所以有效,是因为 0
可以被认为是一个指针常量,而字符串文字会很高兴地衰减为 char const*
。
值得注意的是,正如Chris Culter 指出的那样,根据 27.7.3.6.4 [ostream.inserter.character] 第 3 段,将空指针与输出运算符一起使用是未定义的行为:
template<class traits> basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>& out, const char* s);
[...]
要求:s 不能是空指针。
【讨论】:
过于吹毛求疵,但唯一的指针字面量是nullptr
,0 是一个整数字面量,也是一个空指针常量。
@user657267:是的,我认为你是对的。我相应地编辑了响应。
有点离题,但值得一提的是,实际上不应将空指针传递给operator<<(ostream, char const*)
,因为结果是未定义的行为(引用this answer)。比如libc++勇敢地在指针上调用strlen
就崩溃了。
@ChrisCulter:我已经相应地更新了回复。【参考方案2】:
流操作符具有更高的优先级,所以它总是输出测试。试试:
cout << (test ? "A String" : 1);
【讨论】:
以上是关于C ++中的三元运算符奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章
带括号的三元表达式在 C 中的函数指针声明中返回函数名称的基本原理
Chrome 中的跨域问题可能是奇怪的 Dart HttpRequest 行为的 b/c