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

Posted

技术标签:

【中文标题】C ++中的三元运算符奇怪的行为【英文标题】:Ternery operator in C++ strange behavior 【发布时间】: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 是一个空指针常量.. 【参考方案1】:

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

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

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

    表达式

    expr? "A String": 1
    

    不起作用,因为字符串文字(即char const(&amp;)[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 不能是空指针。

【讨论】:

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

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

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

【讨论】:

以上是关于C ++中的三元运算符奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章

[HNOI2001]矩阵乘积

C中的三元(条件)运算符

带括号的三元表达式在 C 中的函数指针声明中返回函数名称的基本原理

Chrome 中的跨域问题可能是奇怪的 Dart HttpRequest 行为的 b/c

数组中相加和为0的三元组(NC54/考察次数Top30/难度中等)

线性表练习之Example031-找出给定 3 个非空整数集合中所有可能的三元组中的最小距离