首页 > 解决方案 > 无法理解三元运算符的用法

问题描述

有人将此作为解决方案发布,我无法整体理解它,尤其是 while 循环。问题是我有一个n数字数组,我必须打印数组中最大元素出现的次数。

#include <iostream>

int main(){
    int c, n, max = 0;
    std::cin.ignore();
    while(std::cin >> n)
        max < n ? c = !!(max = n) : c += max == n;
    std::cout << c;
    return 0;
}

标签: c++

解决方案


看起来有人试图让这段代码尽可能短。对于程序来说,这很少是一个好的目标。我们可以逐步解开代码,回到更合理的地方。

首先三元运算符max < n ? c = !!(max = n) : c += max == n;可以转换为:

if (max < n) {
    c = !!(max = n);
} else {
    c += max == n;
}

c = !!(max = n);是一种同时设置c为 1 和 max的“聪明”方式n(尽管如果nis会失败0),这可以重写为:

max = n;
c = 1;

最后c += max == n是一种“聪明”的方式,仅cmax == n交替时递增:

if (max == n){
    c++;
}

总之,while 循环的主体是:

if (max < n) {
    max = n;
    c = 1;
} else if (max == n){
    c++;
}

在实际代码中,可读性导致未来的可维护性,如果有人在工作中向我展示这段代码,我会让他们重写它。缩短代码没有任何好处(显然,除非它包含不必要的操作并且可以简化),并且在某些情况下实际上会妨碍编译器优化。


推荐阅读