三元opperator交互的多个部分

时间:2018-06-05 10:45:47

标签: c ternary-operator

这会打印4。为什么呢?

我知道三元运算符是如何工作的,但这使它变得复杂。

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

此外,还会打印d。 ???

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

7 个答案:

答案 0 :(得分:2)

对于第一个,它是一个“嵌套”的terenary运算符。我会在它周围加上括号,使其更具可解码性。考虑IMyDatabase { BbSet<Model1> Model1{get;set;} BbSet<Model2> Model2{get;set;} } TnsDb:IMyDatabase { BbSet<Model1> Model1{get;set;} BbSet<Model2> Model2{get;set;} } SngDb:IMyDatabase { BbSet<Model1> Model1{get;set;} BbSet<Model2> Model2{get;set;} } ,让我们将其转换为public static IMyDatabase GetDb(string scope = "dev") { dynamic db; if (Globals.db == null) { switch (scope.ToLower()) { case "tns": return new TnsDb(); case "sng": return new SngDb(); default: return new TnsDb(); } } 0 ? 1 ? 2 : 3 : 4? else部分执行0 ? (1 ? 2 : 3) : (4)

对于第二个,你错过了0

答案 1 :(得分:1)

使用if..else声明

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

答案 2 :(得分:1)

0 ? 1 ? 2 : 3 : 4

解析为

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

因此,您输出为4

答案 3 :(得分:1)

确实应该打印4.三元运算符的工作原理如下:

expression1

如果返回条件计算结果为真expression2,则返回0?(1?2:3):4。 在您的情况下,结构如下:

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

答案 4 :(得分:1)

三元运营商就像其他人一样。如果在代码中添加括号,事情会变得更简单:

0 ? (1 ? 2 : 3) : 4

请记住,在C中零表示假,所有非零表示为真。因此上述声明在测试时失败并返回其第三部分,即4。

答案 5 :(得分:1)

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

这里的格式说明符是&#34;%d&#34;所以它打印的正确值为4。 但是,在

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

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

答案 6 :(得分:0)

声明中有多个三元运算符 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);