三元运算符交互的多个部分
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
,即从 Right
到 Left
的三元运算符,即首先解决 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" 并忽略了其他参数。
这会打印 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
,即从 Right
到 Left
的三元运算符,即首先解决 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" 并忽略了其他参数。