C++三元运算符的一个有意思的地方



同学群里面讨论的,感觉很有意思,就记录下来了。


问题如下:

代码一

cout << (1 > 2 ? 1 : "1") << endl;

代码二

cout << (1 > 2 ? 0 : "1") << endl;

代码三

cout << (1 > 2 ? "hello" : "hi") << endl; 

运行结果是代码一出错 error C2446: “:”: 没有从“const char *”到“int”的转换,代码二和三没有任何问题。


这里再回顾下三元运算符的用法。

val = exp1 ? exp2 : exp3

exp1为真则val = exp2否则val = exp3。

因此不论什么时候都会涉及到一个val后等号的类型转换。



答案其实很简单,0可以视作null,因此默认代码二中cout输出类型是char *,代码三中亦是如此,而代码一中则会出现两种不同的类型,无法顺利进行类型转换。

此外如果是代码二的条件为假的情况,则连endl也不会输出,这个就不知道怎么回事了。

代码四:

cout << (1 > 2 ? 0 : '1') << endl;
会正确的转换成int类型。


结论:

编译器在编译的时候就根据exp2和exp3确定了val的接收类型,再传给cout。

这里一个不规范的0的写法导致了代码二的正常执行。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值