三元运营商使用问题

时间:2014-12-01 07:47:34

标签: c ternary-operator

我之前使用过三元运算符来处理像if-else这样的条件,但这里不同,即不在?之前检查条件。

  printf( "%d\n",10?0?5:11:12 );

被修改: 那么,如何通过编译器评估11,因为我在第一个?之前没有看到任何条件。

5 个答案:

答案 0 :(得分:5)

表达式10 ? 0 ? 5 : 11 : 12以这种方式解析:10 ? (0 ? 5 : 11) : 12。所以这意味着在第一次测试中,由于10为真,它将评估0 ? 5 : 11,其评估为11,因为0为假。

答案 1 :(得分:1)

您的表达式被解析为10?(0?5:11):12,内部条件表达式(0?5:11)常量折叠为11,然后整个表达式常量折叠为11(自{{1}因为非零,所以是真的。

请注意,条件(例如?: ternary conditional expression的第一个测试操作数)可以是任何标量,非10表达式。特别是void是一个有效的条件。

答案 2 :(得分:1)

将以这种方式解决

printf("%d\n",10?0?5:11:12);

10?(0?5:11):12

首先解决0?5:11,因为0表示为false,因此它将返回11

现在条件将类似于10?11:12

由于10非零条件将为真,因此它将返回11

答案 3 :(得分:1)

printf( "%d\n",10?0?5:11:12 );的语法为(condition)?TRUE:FALSE

两个三元运算符。为了更好的可读性和理解,让我们这样说吧

(10 ? (0 ? 5 : 11) : 12)

因此,内部条件(0 ? 5 : 11)会检查0TRUE还是FALSE。它是FALSE值,[是,零被视为FALSE,非零值被视为TRUE,两者都是完全有效的条件检查sysntax]。所以,它评估为11

现在,对于外部条件,代码显示为(10 ? 11 : 12)。遵循相似逻辑,10TRUE,它返回11。传递给printf()。这就是你如何得到你的输出。

答案 4 :(得分:0)

正在进行的是伪代码:

(但在三元运算符中,首先是内部三元条件得到""计算")

if (10) {  //true
    if(0) {  //false
        print 5
    } else {
        print 11  //Output 11
    }

} else {
    print 12
}

或者作为三元运算符,但更具可读性:

(10 ? (0 ? 5 : 11) : 12)