c++ - 无法理解三元运算符的用法
问题描述
有人将此作为解决方案发布,我无法整体理解它,尤其是 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;
}
解决方案
看起来有人试图让这段代码尽可能短。对于程序来说,这很少是一个好的目标。我们可以逐步解开代码,回到更合理的地方。
首先三元运算符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
(尽管如果n
is会失败0
),这可以重写为:
max = n;
c = 1;
最后c += max == n
是一种“聪明”的方式,仅c
在max == n
交替时递增:
if (max == n){
c++;
}
总之,while 循环的主体是:
if (max < n) {
max = n;
c = 1;
} else if (max == n){
c++;
}
在实际代码中,可读性导致未来的可维护性,如果有人在工作中向我展示这段代码,我会让他们重写它。缩短代码没有任何好处(显然,除非它包含不必要的操作并且可以简化),并且在某些情况下实际上会妨碍编译器优化。
推荐阅读
- mysql - 查询运行时间过长
- javascript - 其他类不存在时的Jquery addclass
- neo4j - 使用 Neo4j 进行接触者追踪 - 有些人未被识别
- django - 为什么 csfr 豁免装饰器不起作用?
- docker - 将作为 samba 共享的主机路径挂载到 Docker 容器中
- ios - IOS 无法播放 16bit 帧。AVAudioFormat pcmFormatInt16 不工作
- angular - StackLayout 中的 ngFor 在构建 apk 后显示为最后一个组件
- javascript - TypeError:无法读取未定义的属性“执行”
- python - 将十六进制表示转换为字节对象
- python - 我如何单击没有类型 = 提交或类型 = 按钮的按钮标签