it-swarm.cn

我应该使用switch语句还是如果...否则为长链?

通常,当我听说switch语句时,将它推迟以替换长if ... else链。但是似乎当我使用switch语句时,我正在写更多的代码,如果...否则我会写。您还遇到其他问题,例如 将所有变量的所有变量都保留在同一范围内

这是代表我通常编写的流程的一些代码( 感谢diam

String comment;   // The generated insult.
int which = (int)(Math.random() * 3);  //  Result is 0, 1, or 2.

if (which == 0) {
    comment = "You look so much better than usual.";
} else if (which == 1) {
    comment = "Your work is up to its usual standards.";
} else if (which == 2) {
    comment = "You're quite competent for so little experience.";
} else {
    comment = "Oops -- something is wrong with this code.";
}

然后他们要我用这个替换它:

String comment;   // The generated insult.
int which = (int)(Math.random() * 3);  //  Result is 0, 1, or 2.

switch (which) {
    case 0:  
             comment = "You look so much better than usual.";
    break;
    case 1:  
             comment = "Your work is up to its usual standards.";
    break;
    case 2:  
             comment = "You're quite competent for so little experience.";
    break;
    default: 
             comment = "Oops -- something is wrong with this code.";
}

似乎使用笨拙的语法编写了更多代码。但是使用switch语句真的有好处吗?

36
TheLQ

对于这种特殊情况,在我看来ifcase都是不好的选择。我将使用一个简单的数组:

String comments[] = {
    "You look so much better than usual.",
    "Your work is up to its usual standards.",
    "You're quite competent for so little experience."
};

String comment = comments[(int)(Math.random() * 3)];

附带说明,通常应该基于数组的大小来计算乘数,而不是硬编码3

至于何时使用大小写/开关,与if语句级联的区别(或至少一个主要区别)是switch可以半自动根据值的数量和密度进行优化,而if语句级联则使编译器别无选择,只能在编写代码时生成代码,一个接一个地测试一个值,直到找到匹配的值。仅涉及三个实际案例,这几乎不成问题,但有了足够的数量,它可能/可能会很重要。

57
Jerry Coffin

if...else if...链的问题是,当我开始阅读它时,我必须查看每个if条件以了解程序在做什么。例如,您可能会有这样的事情:

if (a == 1) {
    // stuff
} else if (a == 2) {
    // stuff
} else if (a == 3) {
    // stuff
} else if (b == 1) {
    // stuff
} else if (b == 2) {
    // stuff
}

(显然,对于少数这样的语句,还不错)

如果没有阅读每条语句,我将无法知道您在中途更改了条件变量。但是,由于switch仅将您限制为单个条件变量,因此我可以一目了然地看到发生了什么。

不过,到最后,我不希望使用switchif...else if的链。通常,更好的解决方案是某种跳转表或字典,以解决诸如原始问题或多态性(如果您的语言支持)的情况。当然,这并不总是可能的,但是我会寻找一个避免使用switch作为第一步的解决方案...

23
Dean Harding
switch (which) {
  case 0: comment = "String 1"; break;
  case 1: comment = "String 2"; break;
  case 2: comment = "String 3"; break;
  default: comment = "Oops"; break;
}

上面写这种类型的开关盒的方式很普遍。之所以觉得开关箱更大,是因为您的身体只有一条线,而对于开关箱,您还需要break语句。因此,开关盒的外壳尺寸是其他外壳的两倍。使用更大量的代码,break语句不会对主体增加太多。对于单行主体,通常的做法是在case语句的同一行中编写代码。

正如其他人已经提到的那样,切换情况使意图更加清晰,您希望基于单个变量/表达式的值做出决定。我的评论纯粹是出于可读性的考虑,而不是基于性能。

14
aufather

在这种情况下,switch语句更清楚地符合代码的意图:根据单个值选择要执行的操作。

另一方面,if语句很难阅读-您必须查看所有语句以确保正在发生的事情。对我来说,它的代码更少(即使字符数may更高),因为需要解析的代码也更少。

8
FinnNk

我同意Jerry的观点,在这种情况下,最好使用字符串数组,但总的来说,使用switch/case语句比使用elseifs链更好。它更易于阅读,并且有时编译器可以更好地优化这种方式,但是还有另一个好处:调试起来非常简单。

当您按下该开关时,您只需要一步就可以到达正确的分支,而不必一次小心地跨过多个if语句,并且可能击键太快并越过了它而错过了一些东西,重新开始。

8
Mason Wheeler

我更喜欢在这种情况下进行切换,它与代码点更好地匹配,对每个不同的输入值执行不同的语句。 if..else的行为更像是“技巧”,以达到相同的效果。

switch语句也更简洁,所有这些==

另外,对于C中的大块,切换速度更快。

else..if可能更适合当您有范围(在1到100之间,做到这一点,在100到200之间做到这一点),或者在C中,当您尝试使用像字符串这样的元素进行切换时(在其他语言中也是可能的) )。是一样的.

当我用C编程时,我倾向于使用很多开关。

3
Khelben

我通常不喜欢这两种方法。长切换或if语句只是被重构为面向对象的抽象(但是您的示例我将其分类为短而不是长)。

我会亲自将这种代码包装到单独的帮助程序方法中。

private string GetInsult()
{
    int which = (int)(Math.random() * 3);  //  Result is 0, 1, or 2.

    switch (which) {
        case 0: return "You look so much better than usual.";
        case 1: return "Your work is up to its usual standards.";
        case 2: return "You're quite competent for so little experience.";
        default: return "Oops -- something is wrong with this code.";
    }
}

public void Foo()
{
    string comment = GetInsult();
    Print(comment);
}

将switch放置在单独的方法中,可以将return语句直接放置在switch语句内部(至少在c#中),而无需使用break语句,从而使代码更易于阅读。

这比if/else if/else if方法好得多。

2
Pete

选择高效,简洁的内容,然后document不仅要完成您的操作,还请选择原因。

可以重新访问代码,而并非总是由原始作者来访问。

有时候,您可能会故意选择一种实现而不是另一种实现因为您正在思考不存在的代码。

2
Walt Stoneburner

使C/C#样式switch特别令人讨厌的一件事是坚持case值是文字。关于VB/VB.NET的一件好事是select/case允许每种情况都是任何布尔表达式。 That很方便。只要一系列互斥的布尔表达式通常是有用的,一系列if/else ifs更灵活,更不用说键入和读取更高效了。

0
Joel Brown

在python中,没有switch语句,因为if/Elif/else是Nice:

a = 5

if a==1:
    print "do this"
Elif a == 2:
    print "do that"
Elif a == 3:
    print "do the other"
Elif 3 < a < 9:
    print "do more"
Elif 9 <= a < 15:
    print "do nothing"
else:
    print "say sorry"

简单吧?

0
Christopher Mahan