无法获得三元运算符的输出

时间:2017-02-03 13:20:27

标签: c ternary-operator

代码

#include<stdio.h>
main()
{
    int big, x = 3, y = 2, z = 1, q = 4;

    big = (x > y
        ? (z > x ? 20 : 10 && x > y ? 85 : 12)
        : (y > z ? 40 : 10 || x < q ? 30 : 10)
    );

    printf("\nbig =%d", big);
    //getch();
}

输出是85但是我不确定它是如何工作帮助我理解它..

2 个答案:

答案 0 :(得分:2)

&&的优先级高于?:

big=(x>y?(z>x?20:10 && x>y?85:12): (y>z?40:10 || x<q?30:10));` 

将被解析为

big=(x>y?(z>x ? 20: ( (10 && x>y) ?85:12) ): (y>z ? 40: (10 || x<q?30:10)));

由于x大于y,因此20: (10 && x>y?85:12)将被执行。 10x > y都将评估为true(10 && x>y) ?85:12)将评估为85

答案 1 :(得分:0)

我有点清楚地重写它(假设你知道简单的三元是什么):

#include<stdio.h>

main(){
 int big,x=3,y=2,z=1,q=4;
 if(x>y){
    int tmp1 = (z > x) ? 20:10;
    int tmp2 = (x > y) ? 85:12;
    big= (tmp1>=tmp2) ? tmp1:tmp2;
 }else{
    int tmp1 = (y > z) ? 40:10;
    int tmp2 = (x > q) ? 30:10;
    big = (tmp1<=tmp2) ? tmp1:tmp2;
 }
 printf("\nbig =%d",big);
}

一个复杂的陈述是对以下方面的评价: (a&amp;&amp; b)=&gt;返回a和b之间的最大值 (a || b)=&gt;返回a和b之间的最小值

希望我回答。