这会打印4
。为什么呢?
我知道三元运算符是如何工作的,但这使它变得复杂。
printf("%d", 0 ? 1 ? 2 : 3 : 4 );
此外,还会打印d
。
???
int x=0, y=1 ;
printf( "d", x ? y ? x : y : x ) ;
答案 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
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);