三元运算符交互的多个部分

Multiple parts of ternary opperators interaction

这会打印 4。为什么?

我知道三元运算符的工作原理,但这让它变得复杂。

printf("%d", 0 ? 1 ? 2 : 3 : 4 );

这也会打印 d。 ???

int x=0, y=1 ;
printf( "d", x ? y ? x : y : x ) ;

对于第一个,它是一个 "Nested" 三元运算符。我会在它周围加上括号以使其更易于解码。考虑 0 ? 1 ? 2 : 3 : 4,让我们将其转换为 0 ? (1 ? 2 : 3) : (4)0?执行的 else 部分是 4

第二次你错过了 %d

if..else 语句分解

if(0){
    if(1)
        printf("%d\n", 2); 
    else
        printf("%d\n", 3);
} 
else
    printf("%d\n", 4);
0 ? 1 ? 2 : 3 : 4

解析为

(0 ? (1 ? 2 : 3) : 4)

因此,您得到了 4 的输出。

确实应该打印 4。三元运算符的工作方式如下:

(condition) ? expression1 : expression2

如果条件计算结果为真,则返回 expression1,否则返回 expression2。 在您的情况下,结构如下:

0?(1?2:3):4 即这里的 1?2:3 是表达式 1,4 是表达式 2,我们有 0 的替代条件。如您所知,0 在条件中的计算结果为 false,任何非零值的计算结果为 true。 所以这里因为条件为假(即0)返回表达式2(4)。

语句中有多个三元运算符 printf("%d", 0 ? 1 ? 2 : 3 : 4 );

当同一个运算符多次出现时,我们会检查 associativity,即从 RightLeft 的三元运算符,即首先解决 right most ternary opeartor。或者你可以在 man 1 operator

中看到这个

首先选择最右边的三元运算符 1 ? 2 : 3,结果是 2。现在 3 走了。

现在变成 0 ? 2 : 4,结果是 4。这就是它打印 4 的原因。

注意:- 正如其他人所说,使用右结合三元运算符,您可以将它们堆叠起来并构建一个 if-else 表达式,如下所示:

if(0){ if(1) printf("%d\n", 2); else printf("%d\n", 3); } else printf("%d\n", 4);

三元运算符就像 if else。如果在代码中添加括号,事情会变得更简单:

0 ? (1 ? 2 : 3) : 4

请记住,在 C 语言中,零表示假,所有非零表示真。所以上面的语句在测试中失败,returns 它的第三部分,即 4.

printf("%d", 0 ? 1 ? 2 : 3 : 4 );

这里的格式说明符是“%d”,所以它打印的是正确的值 4。 但是,在

int x=0, y=1 ;
printf( "d", x ? y ? x : y : x ) ;

这里没有提到格式说明符,所以它只是打印了 "d" 并忽略了其他参数。