【问题标题】:Ternery operator in C++ strange behaviorC ++中的三元运算符奇怪的行为
【发布时间】:2014-11-06 06:08:54
【问题描述】:

一般原型: exp1?exp2:exp3

三元运算符的返回类型为 exp2。 exp3 必须具有与 exp2 相同的返回类型或至少具有隐式转换。否则会报错

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

0也是int值,看不懂。

 #include <iostream>
   using namespace std;

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

   return 0;
   }

【问题讨论】:

  • 0 被隐式转换为空指针,或者按照标准的说法,0 是一个空指针常量。
  • 注意这里打印的0不是表达式右边的0,而是test的值。三元表达式的值被丢弃。
  • 谢谢...是的,你是对的..0 是一个空指针常量..

标签: c++ ternary-operator


【解决方案1】:

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

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

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

  1. 表达式

    expr? "A String": 1
    

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

  2. 表达式

    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 不能是空指针。

【讨论】:

  • 过于吹毛求疵,但唯一的指针字面量是nullptr,0 是一个整数字面量,也是一个空指针常量。
  • @user657267:是的,我认为你是对的。我相应地编辑了响应。
  • 有点离题,但值得一提的是,实际上不应将空指针传递给operator&lt;&lt;(ostream, char const*),因为结果是未定义的行为(引用this answer)。比如libc++勇敢地在指针上调用strlen就崩溃了。
  • @ChrisCulter:我已经相应地更新了回复。
【解决方案2】:

流操作符具有更高的优先级,所以它总是输出测试。试试:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-29
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多