【问题标题】:Trying if "?:" conditional block can be made simpler尝试 if "?:" 条件块可以更简单
【发布时间】:2019-02-25 14:36:39
【问题描述】:

有人问我是否可以编写代码来找到五个数字中最大的一个,而不是使用传统的 if...else(不能使用 switch 或遍历 - 受限)我决定使用紧凑版本,但是IMO 我发现它冗长且令人困惑(首先尝试了三个数字):

 #include<stdio.h>

 int main(void)
 {
     int a[3]={9,5,13};
     printf("Biggest No. is: %d\n",(a[0]>
                                         (a[1]>a[2]?a[1]:a[2])?a[0]:
                                                                    (a[1]>a[2]?a[1]:a[2])));
     return 0;
 }

现在用这种方法对五个数字做这件事似乎是灾难性的,有没有什么办法可以使它更简单(仅通过使用?: 的这种紧凑方法)作为编写充当条件的表达式/strong> 再写成结果 好像太多了?

或者我应该使用传统的if ... else 块吗?

发现一件事:将宏用于一个表达式并将该宏用作另一个比较的条件和结果。

【问题讨论】:

  • 我认为你应该做一个循环,而不是一个 --simple-- if else
  • 是的,使用if ... else,或者使用sorting network,并取最后一个值。
  • 在我看来,带有 if else 块的代码更容易阅读和维护。
  • 如果只能使用 if else,那我宁愿使用它也不愿使用嵌套的几乎不可读的条件运算符集
  • ?: 真的不应该用于像这样的复杂情况,因为你说它很快就会变得不可读。理智的解决方案是使用循环来检查每个项目,或者对数据进行排序。其他都是废话,不值得花时间去琢磨。

标签: c


【解决方案1】:

试试这个:

int main(){

    int a[3]={9,5,13};

    int arr1[] = { a[0], a[1] };
    int arr2[] = { arr1[ a[0] < a[1] ], a[2] };

    printf("max is %d\n", arr2[ arr2[0] < a[2] ]);
}

我尝试了几个案例,似乎有效。

【讨论】:

    【解决方案2】:

    您可以使用嵌套宏来分解逻辑。

    #define MAX2(a,b)       (a)>(b)?(a):(b)
    #define MAX3(a,b,c)     (a)>(b)? MAX2(a,c): MAX2(b,c)
    #define MAX4(a,b,c,d)   (a)>(b)? MAX3(a,c,d): MAX3(b,c,d)
    #define MAX5(a,b,c,d,e) (a)>(b)? MAX4(a,c,d,e): MAX4(b,c,d,e)
    

    【讨论】:

    • 我已经在我的问题中提到了这个作为解决方案,但谢谢 - 这是唯一的方法。
    • 我哑口无言:(
    猜你喜欢
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多