三元运算符在C ++中的奇怪行为

时间:2014-11-06 06:08:54

标签: c++ ternary-operator

通用原型: 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;
   }

2 个答案:

答案 0 :(得分:8)

三元运算符的优先级相当低。优先级较低的唯一运算符是逗号运算符。因此,您的表达式被解释为

(std::cout << test) ? "A String": 1;

这可能不是你想要的。但是,您的问题实际上是关于两个表达式之间的区别:

  1. 表达式

    expr? "A String": 1
    

    不起作用,因为字符串文字(即类型char const(&)[9])与整数文字(即int类型)之间没有共同类型。

  2. 表达式

    expr? "A String": 0
    

    正在运行,因为0可以被认为是一个指针常量,而字符串文字会很高兴地衰减为char const*

  3. 值得注意的是,正如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);