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

Tan*_*ena 2 c++ ternary-operator

通用原型:exp1?exp2:exp3

三元运算符的返回类型为exp2.exp3必须具有与exp2相同的返回类型,或者至少具有隐式转换.否则会抛出错误

在下面的程序中,我在CodeBlocks中遇到错误,因为exp3是int而exp2是char*.Bjut当我用0替换1时,它正在打印0 ..

0也是一个int值.我无法理解.

 #include <iostream>
   using namespace std;

   int main()
   {
   int test = 0;
   cout << test ? "A String" : 1;

   return 0;
   }
Run Code Online (Sandbox Code Playgroud)

Die*_*ühl 8

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

(std::cout << test) ? "A String": 1;
Run Code Online (Sandbox Code Playgroud)

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

  1. 表达方式

    expr? "A String": 1
    
    Run Code Online (Sandbox Code Playgroud)

    因为字符串文字(即类型char const(&)[9])和整数文字(即类型)之间没有共同类型,因此无效int.

  2. 表达方式

    expr? "A String": 0
    
    Run Code Online (Sandbox Code Playgroud)

    正在工作,因为0可以认为是一个指针常量,字符串文字很乐意衰为a 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);
Run Code Online (Sandbox Code Playgroud)

[...]

要求:s不应为空指针.