我之前使用过三元运算符来处理像if-else
这样的条件,但这里不同,即不在?
之前检查条件。
printf( "%d\n",10?0?5:11:12 );
被修改:
那么,如何通过编译器评估11
,因为我在第一个?
之前没有看到任何条件。
答案 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)
会检查0
是TRUE
还是FALSE
。它是FALSE
值,[是,零被视为FALSE
,非零值被视为TRUE
,两者都是完全有效的条件检查sysntax]。所以,它评估为11
。
现在,对于外部条件,代码显示为为(10 ? 11 : 12)
。遵循相似逻辑,10
为TRUE
,它返回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)