我是在这一道题上看到一个解的方案感觉挺有趣:
给的解是:
运用了三个三目操作符。来让我们回想一下三目操作符:
先说结论:
? : 从左往右运算
? :跟相近的相关
验证:
一.两个三目操作符?与:分开:
代码如下:
#include <stdio.h>
int main()
{
int a = 1;
int b = 1;
int c = 1;
int d = 1;
1 ? ++a : ++b ? ++c : ++d;
printf("a = %d\n", a);//2
printf("b = %d\n", b);//1
printf("c = %d\n", c);//1
printf("d = %d\n", d);//1
return 0;
}
这里结果是后面注释的内容 2,1,1,1
由此我们可以推测1 ?后直接a++后退出
如果看不懂我们改造一下:
#include <stdio.h>
int main()
{
int a = 1;
int b = 1;
int c = 1;
int d = 1;
1 ? ++a : (++b ? ++c : ++d);
printf("a = %d\n", a);//2
printf("b = %d\n", b);//1
printf("c = %d\n", c);//1
printf("d = %d\n", d);//1
return 0;
}
结果是2,1,1,1和上面一样。
这样很明显是从左到右运算,再验证一下:
int main()
{
int a = 1;
int b = 1;
int c = 1;
int d = 1;
0 ? ++a : ++b ? ++c : ++d;
printf("a = %d\n", a);//1
printf("b = %d\n", b);//2
printf("c = %d\n", c);//2
printf("d = %d\n", d);//1
return 0;
}
结果是1,2,2,1
这里根据以上验证的从左往右运算,++b后b=2为真进入++c。
这样两个三目操作符叠加验证得出从左往右计算后再进阶一下
二.两个三目操作符??在一起:
代码如下:
int main()
{
int a = 1;
int b = 1;
int c = 1;
int d = 1;
1 ? ++a ? ++b : ++c : ++d;
printf("a = %d\n", a);//2
printf("b = %d\n", b);//2
printf("c = %d\n", c);//1
printf("d = %d\n", d);//1
return 0;
}
这样是不是看不懂,没关系我们先加个括号验证下猜想:?与:相近的先运算
int main()
{
int a = 1;
int b = 1;
int c = 1;
int d = 1;
1 ? (++a ? ++b : ++c) : ++d;
printf("a = %d\n", a);//2
printf("b = %d\n", b);//2
printf("c = %d\n", c);//1
printf("d = %d\n", d);//1
return 0;
}
结果一样可能猜想正确,这样逐个看,先算括号里的:
++a ,a就等于2。为真++b,b就等于2。a为真所以返回b。所以简化下来就是 1 ? b : ++d; 那结果就是b啦!!!
再把1换成0:
int main()
{
int a = 1;
int b = 1;
int c = 1;
int d = 1;
0 ? ++a ? ++b : ++c : ++d;
printf("a = %d\n", a);//1
printf("b = %d\n", b);//1
printf("c = %d\n", c);//1
printf("d = %d\n", d);//2
return 0;
}
运算结果为:1,1,1,2
这样一看只有++d了所以我们猜想正确,? :距离在一起算一个操作符
加个()也一样
int main()
{
int a = 1;
int b = 1;
int c = 1;
int d = 1;
0 ? (++a ? ++b : ++c) : ++d;
printf("a = %d\n", a);//1
printf("b = %d\n", b);//1
printf("c = %d\n", c);//1
printf("d = %d\n", d);//2
return 0;
}
好了验证完结论就是
? : 从左往右运算
? : 跟相近的相关
题解:
回到原题:
printf("%d\n",a>b? a>c? a:c : b>c? b:c);
看着很晕加个括号:
printf("%d\n",a>b?(a>c? a:c) : b>c? b:c);
这样是不是很明显了,如果a>b,就为真进入a>c的三目操作符中判断,如果为假就进入b>c。再分别看a,c或者b,c的大小就一个三目操作符。
以上有误请大佬指出。