以FizzBuzz为例,for循环中的这个switch case在每种情况下使用break。
we got the following error: ERROR: unterminated dollar-quoted string at or near "$$ BEGIN NEW.changetimestamp = now()" Position: 79 [ERROR:0, SQLSTATE:42601], while trying to run this SQL script:
在Mozilla的docs中,他们说......
与每个案例标签关联的可选break语句可确保 一旦匹配的语句,程序就会断开 执行并继续执行切换后的语句。如果 break被省略,程序在下一个继续执行 switch语句中的陈述。
我假设他们的意思是当脚本检查num%15 == 0时,如果没有中断并且尽管它匹配为true,则它会转到num%3 == 0并且等等。那么我用100,000个数字进行了两次测试。一个有休息,一个没有休息。
我发现中断和不中断之间的差异大约为2秒,中断越来越快。但是经过多次迭代。
我的问题是,对于大多数构建小规模应用程序的开发人员来说,在循环中使用中断是否真的很重要?这是习惯和偏好的问题吗?想法?
答案 0 :(得分:3)
当在switch语句中满足case
条件时,它将执行该switch语句中的所有代码块,直到它达到退出命令(想想break
或return
)。所以break
不仅改变了性能速度,而且还改变了功能。
考虑切换语句的简单方法是链接if
- else
语句的替代方法。
您的switch
代码可以轻松编写
if (num % 15 == 0) {
console.log("FizzBuzz");
} else if (num % 3 == 0) {
console.log("Fizz");
} else if (num % 5 == 0) {
console.log("Buzz");
} else {
console.log(num);
}
如果删除break;
语句,您将更改代码实际运行的方式。它会表现得更像
if (num % 15 == 0) {
console.log("FizzBuzz");
}
if (num % 3 == 0 || num % 15 == 0) {
console.log("Fizz");
}
if (num % 5 == 0 || num % 3 == 0 || num % 15 == 0) {
console.log("Buzz");
}
console.log(num);
主要区别在于缺少else
条件。
答案 1 :(得分:2)
您可以使用<RestorePackages>true</RestorePackages>
...
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
...
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>
获得不同的结果。如果没有break
,它会在break
上传递,例如它会打印出num = 15
,"FizzBuzz"
,"Fizz"
和"Buzz"
。而"15"
只会打印break
。说过"FizzBuzz"
案例之后你不需要休息,如果它在交换机的末尾。
答案 2 :(得分:0)
如果不包含break
声明,您无疑会介绍 错误( !) 进入你的程序!
原因如下:
如果不包含break
语句,逻辑将“简单地”落入代码中以获取其他条件。 。 。 但不会(!) 评估这些条件!它会直接崩溃,就像众所周知的中国商店中众所周知的公牛一样。
换句话说,没有break
语句, (num % 15 == 0)
的情况会console.log()
四(!!)(不是“一个”)消息。同样,(num % 3 == 0)
会记录 3,,依此类推。
“嘿...... 不要去那里。”
=====
编辑:考虑switch
的原始(“C ...”)概念是“多方式{{ 1}}“发生在构造的 top ,它分支到体内的goto
- 点之一。 case
语句生成break
,将您发送到goto
的末尾。如果您不包含它,那么“有用”的假设就是您打算做其他事情会发生的事情:一个switch
只会“堕落”到下一个。 (缺少case
,正是所做的那样。) “警告编码器!”
答案 3 :(得分:0)
详细说明Callum Morrisson的答案:
您可以 返回 一个案例中的值的情况下,可以优雅地移除break
的情况。
例如,
switch(expression) {
case x:
return *something*
case y:
return *something different*
}
这不会由于return
引起您的误解而导致失败。在此示例中,您可以将return
视为break
的两倍。
如果在一个案例中同时在return
和break
的switch语句上运行linter,则由于return
破坏了您,您将收到无法到达的代码错误。 break
之前有机会执行该语句。
// eslint
switch(expression) {
case x:
return *something*
break; // error unreachable code
case y:
return *something different*
break; // error unreachable code
}