假设您只有有限数量的可能条件,可以将它们称为a,b,c,d,并且您确信任何其他可能性都是不可能的。
做得好吗
if(a)
do_something();
else if(b)
do_something();
else if(c)
do_something();
else if(d)
do_something();
或
if(a)
do_something();
if(b)
do_something();
if(c)
do_something();
else
do_something();
答案 0 :(得分:2)
如果我理解正确的话。否则只是有条件地检查。第二个将检查每个是否除非在每个if之后都有回访。
答案 1 :(得分:1)
执行此操作的标准方法是使用“switch”或“case”(取决于语言)语句。例如,在PHP中你会写:
switch ($condition) {
case 'a': do_something(); break;
case 'b': do_something(); break;
default: do_something();
}
但确切的语法将取决于您所写的语言。在这种情况下,您将在“默认”部分中包含其他可能性的说明,如果是,则最好在此处包含一些内容可能条件不是“a”或“b”(否则你最终会得到一个bug!)
答案 2 :(得分:1)
我会选择第一个,但是在另一个else
块中有一个断言或类似的东西。
if(a)
do_something();
else if(b)
do_something();
else if(c)
do_something();
else if(d)
do_something();
else
assert(0); // or throw ImpossibleException or whatever
(此建议也适用于switch
标签的default
块
即使您认为这是不可能的,一般来说,进行额外检查仍然是“深度防御”练习:在某些时候您可能会在其他地方更改您的应用程序,以便可能的选择变得更多(典型案例)正在添加enum
值并忘记更新这部分代码;如果没有这样的检查,你就会有很长一段时间没被注意到的错误。
答案 3 :(得分:1)
没有“更好”的方式,这完全取决于控制流程的进展方式。
if(a)
do_something();
else if(b)
do_something();
else if(c)
do_something();
else if(d)
do_something();
这是一个分支控制流,这意味着if
将以首先出现的顺序进行测试,并且第一个遇到评估为true的将在所有条件中被挑选和执行,所有剩余的将被跳过。
if(a)
do_something();
if(b)
do_something();
if(c)
do_something();
else
do_something();
这是一个顺序控制流程(尽管你的最后一个if是分支控制流程),这意味着将测试所有if
块并且每个被评估为true的块将被选中并执行。 (虽然最后一个,好像c
为假,但只会执行else块。)
选择使用哪一个完全取决于需要执行的内容。对于switch
块,它们大多是分支控制流的快捷方式,通常在编译后表现完全相同,但这不一定正确(即不使用{{1}时或者某些语言支持break
不同的情况等等),但这超出了范围。
答案 4 :(得分:0)
在后一个示例中,您始终在评估所有条件,而第一个条件仅评估它们,直到找到true
条件为止。所以第一段代码的表现稍好一些。
如果您不喜欢这么多嵌套条件,return
/ break
找到第一个后的方法:
if(a)
return do_something();
if(b)
return do_something();
if(c)
return do_something();
return do_something();
......除非你忠实地相信单身return
的教会。
答案 5 :(得分:0)
两个代码段不同。
在第一个中,当且仅当先前条件错误时,才会测试每个else if
。例如,如果a
是正确的,则根本不会对其他人进行测试。
第二个片段测试每个条件都与先例无关。
与另一个答案中的说法一样,第一个代码段可以替换为switch
语句,具体取决于您使用的条件和语言。但第二个片段必须保持不变。
所以我的最后一句话是:这不是“更好或不更好”的问题,因为两个代码都做不同的事情。 这取决于你想做什么!
答案 6 :(得分:0)
第二个版本将评估每个if语句,而不管先前评估的结果如何。
事实上它甚至会显示错误的行为,因为你想要实现的目标,因为如果条件不是c,则总是输入最后一个。而不是它不是a,b或c之一。
第一个版本应该按预期工作。