通用原型(prototype): exp1?exp2:exp3
三元运算符的返回类型为 exp2。 exp3 必须具有与 exp2 相同的返回类型或至少具有隐式转换。否则会报错
在下面的程序中,由于 exp3 是 int 而 exp2 是 char*,我在 CodeBlocks 中收到了预期的错误。但是当我用 0 替换 1 时,它正在打印 0..
0 也是一个 int 值。我无法理解。
#include <iostream>
using namespace std;
int main()
{
int test = 0;
cout << test ? "A String" : 1;
return 0;
}
最佳答案
三元运算符的优先级相当低。唯一具有较低优先级的运算符是逗号运算符。因此,您的表达式被解释为
(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);
[...]
Requires: s shall not be a null pointer.
关于c++ - C++ 奇怪行为中的三元运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26772806/