通用原型: EXP1 EXP2:EXP3
三元运算符的返回类型为exp2。 exp3必须具有与exp2相同的返回类型,或者至少具有隐式转换。否则会抛出错误
在下面的程序中,我在CodeBlocks中遇到错误,因为exp3是int而exp2是char *。当我用0替换1时,它正在打印0 ..
0也是一个int值。我无法理解。
#include <iostream>
using namespace std;
int main()
{
int test = 0;
cout << test ? "A String" : 1;
return 0;
}
答案 0 :(得分:8)
三元运算符的优先级相当低。优先级较低的唯一运算符是逗号运算符。因此,您的表达式被解释为
(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不应为空指针。
答案 1 :(得分:2)
流运算符具有更高的优先级,因此它将始终输出测试。尝试:
cout << (test ? "A String" : 1);