if else 会一定程度影响性能,在大量循环的情况下,它的性能会略微低一点,因为分支预测的关系。但其实,大多数情况下我们不用过早的进行性能优化[1]。毕竟,通常只需要优化用profiler测定出来的性能瓶颈,其他地方的代码不需要。
至于可维护性?具体情况具体分析。
先考虑一下,实际工程中,如果你需要维护一个屎山级别的项目,你最害怕的是什么问题?
你最害怕的是:当你改一个地方的时候,会莫名其妙的影响某个不知道为什么会被牵连的地方。无论怎么改都会导致其它bug,最后无从下手。
所以实际情况是:代码越少复用,越少耦合,越少条件判断,越容易成为一份容易维护的代码。
至于最初面对的问题:改一个功能需要改多处代码,现在反而不是问题,因为现在编辑器的查找替换功能都非常强大,把所有使用的地方搜索出来,逐一修改即可。
你当年以为把一处代码提出来让多个模块公用,是一个好主意,十年后,这可能就会成为一个定时炸弹。
你可能以为老工程师喜欢把一份代码复制来复制去是一个很糟糕的行为,然而实际上,代码刚复制的时候看起来是一样,软件经过几十个版本的迭代,每一份代码就可能全变成不一样的,有经验的工程师一开始就预测了他们未来将会变成不一样。所以一开始就不让他们共享同一份代码。
那么反过来呢?如果你一开始就试图让多个地方公用同一份代码,结局就是:每当我们需要改一个地方的时候就会加一个if else,因为需要改的只有一处,你多个地方共用了同一份代码,导致为了改这一处使用场合,必须加个条件判断限定到某个特定场合。在未来,这种不恰当复用导致的增加耦合,会逐渐成长为不可维护的灾难。
所以 if else 究竟会不会影响维护?我认为是这样:
其它答主说的很好,但是是从“分支预测”与“CPU流水线”角度讲的,漏了很基本的一环:
C语言实践中,用switch-case代替if-else可以获得相当可观的性能提升。
例如某些涉及词法分析的程序中,有类似这样的逻辑:
// 仅展示程序结构 if (c==',') { } else if (c=='.') { } else if (c==';') { } else if (c=='!') { } else if (c=='[') { } else if (c==']') { }
当分析一个较大的源代码文件时,会发现if判断执行了很多次,是一个开销热点。而这里想要优化也十分容易,改为:
// 仅展示程序结构 switch (c) { case ',': { break;} case '.': { break;} case ';': { break;} case '!': { break;} case '[': { break;} case ']': { break;} }
改为这样以后进行性能测试,会发现显著的性能提升。
这也是C语言中switch-case的意义所在。
以上两种写法,性能有差异的原因也很简单:在if-else判断中,假如遇到了字符']',要进行6次判断,前5次的 , . ; ! [ 都不相等时,才会跳到第6种情况。
而switch-case就可以直接跳转到case ']'的情况,少了很多步判断,在分析较大的文件时优化效果立竿见影。
通过if-else与switch-case的对比,可以加深对if-else优缺点的了解。
这里要追根究底的话,还有一个问题:C语言编译器如何实现一个快速的switch-case结构?
这个要展开的话,又是一个新的话题了。有兴趣的读者可以参考:
技术上:光刻机的制造和使用工艺。
金融上:打破美元的霸权。
军事上:台湾问题。
别的问题(房产绑架经济、老龄化、东西部平衡等)都是发展中的问题,都是可能通过发展来解决的。
上面列的3个问题是当前面临的核心问题。