switch
case
当你需要在同一个案例中测试a 或 b时,你将如何使用?
switch (pageid) {
case "listing-page" || "home-page":
alert("hello");
break;
case "details-page":
alert("goodbye");
break;
}
Run Code Online (Sandbox Code Playgroud) 在下面的代码中,我使用[[fallthrough]]
C++ 1z中的标准属性来记录需要的漏洞:
#include <iostream>
int main() {
switch (0) {
case 0:
std::cout << "a\n";
[[fallthrough]]
case 1:
std::cout << "b\n";
break;
}
}
Run Code Online (Sandbox Code Playgroud)
使用GCC 7.1,代码编译时没有错误.但是,编译器仍然警告我一个问题:
warning: this statement may fall through [-Wimplicit-fallthrough=]
std::cout << "a\n";
~~~~~~~~~~^~~~~~~~
Run Code Online (Sandbox Code Playgroud)
为什么?
我正在GCC编译器版本7.1.0上测试C++ 17的功能.这与fallthrough
属性有关,以下示例(实例)在此处改编自在线CPP参考
#include "iostream"
using namespace std;
int f(int n) {
switch (n) {
case 1:
case 2:
n = n + 20;
[[fallthrough]];
case 3: // no warning on fallthrough
n = n + 30;
case 4: // compiler may warn on fallthrough
[[fallthrough]]; // illformed, not before a case label
//n = n + 40; //commented out to test if compiler will warn.
}
return n;
}
int main()
{
cout << …
Run Code Online (Sandbox Code Playgroud) 我们知道Duff的设备使用隔行开关和循环的结构交错,如:
send(to, from, count)
register short *to, *from;
register count;
{
register n = (count + 7) / 8;
switch (count % 8) {
case 0: do { *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
} while (--n > 0);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在Swif 2.1中,当我们在Swift文档中读到时,switch-case控制流并没有隐含地落后:
没有隐含的堕落 …
case "$action" in
a|b)
echo for a or b
;;&
b|c)
echo for c or b
;;&
*)
echo for everything ELSE
;;&
esac
Run Code Online (Sandbox Code Playgroud)
因此,正如您所看到的,我使用的;;&
是而不是;;
ifaction=b
它将触发前两种情况。
然而,这样做的一个缺点是*)
不再“意味着”“其他一切”,而是匹配“一切”;因此b
也会触发最后一个。
PowerShell能够做我想做的事情,因为它有一个专用的default
关键字,Bash有类似的东西吗?
诸如详尽的解决方法之类的怎么[!(a|b|c)])
样?
做类似的事情会很方便case 5 in 4) echo bob; ;;& esac || echo DEFAULT
,但case
似乎不会返回任何代码。
Rust 中的match
只执行一只手臂。我从 Murmurhash 3 中找到了这段代码片段:
switch(len & 15)
{
case 15: k2 ^= ((uint64_t)tail[14]) << 48;
case 14: k2 ^= ((uint64_t)tail[13]) << 40;
case 13: k2 ^= ((uint64_t)tail[12]) << 32;
case 12: k2 ^= ((uint64_t)tail[11]) << 24;
case 11: k2 ^= ((uint64_t)tail[10]) << 16;
case 10: k2 ^= ((uint64_t)tail[ 9]) << 8;
case 9: k2 ^= ((uint64_t)tail[ 8]) << 0;
k2 *= c2; k2 = ROTL64(k2,33); k2 *= c1; h2 ^= k2;
case 8: k1 ^= …
Run Code Online (Sandbox Code Playgroud) switch ($foo)
{
case 3 || 5:
bar();
break;
case 2:
apple();
break;
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,第一个switch语句是否有效?bar()
如果值为$foo
3或5,我希望它调用该函数
这里着名的"fizz buzz"程序在Go中使用switch/case和if/else条件.问题是使用switch/case会产生意外的输出,而if/else(具有相同的条件)工作正常.我知道golang中的switch/case与其他C系列语言不同,但是这个代码片段有什么问题?
func main() {
const (
FIZZ = 3
BUZZ = 5
)
//section with switch/case gives unexpected output
for i := 1; i <= 30; i++ {
switch {
case i % FIZZ == 0:
fmt.Printf("%d fizz\t", i%3)
fallthrough
case i % BUZZ == 0:
fmt.Printf("%d buzz\t", i%5)
}
fmt.Printf("\t%d\n", i)
}
fmt.Printf("now towards the if/else\n")
//section with if/else works as expected
for i := 1; i <= 30; i++ {
if i % FIZZ == 0 { …
Run Code Online (Sandbox Code Playgroud) 我有以下代码:
package main
import (
"fmt"
)
func main() {
switch {
case 1 == 1:
fmt.Println("1 == 1")
fallthrough
case 2 == 1:
fmt.Println("2 == 1")
}
}
Run Code Online (Sandbox Code Playgroud)
在 go 操场上打印两行 -请参阅此处的示例。我本来希望 fallthrough 语句包括对下一个case
语句的评估,但情况似乎并非如此。
当然,我总是可以使用一堆if
语句,所以这不是一个真正的障碍,但我很好奇这里的意图是什么,因为在我看来这不是一个明显的结果。
有人愿意解释吗?例如:在这段代码中,我怎样才能让第 1 和第 3 种情况执行?
目前在c#7(版本15.3.4)中,以下代码对编译有效,但两个变量都是合法不可用的.
switch(fruit)
{
case Apple apple:
case Orange orange:
// impossible to use apple or orange
break;
case Banana banana:
break;
}
Run Code Online (Sandbox Code Playgroud)
如果您尝试使用它们,则会得到熟悉的错误,在访问之前可能无法初始化变量.
有时在模式匹配中,您不关心确切的类型,只要该类型属于您想要的类别.这里只以苹果和橘子为例.
List<Fruit> applesAndOranges = new List<Fruit>();
switch(fruit)
{
case Fruit X when X is Apple || X is Orange:
applesAndOranges.Add(X);
break;
case Banana banana:
break;
}
Run Code Online (Sandbox Code Playgroud)
有更好的方法吗?
fall-through ×10
c++ ×2
c++17 ×2
go ×2
bash ×1
c ×1
c# ×1
c#-7.0 ×1
conditional ×1
duffs-device ×1
fizzbuzz ×1
gcc ×1
gcc-warning ×1
javascript ×1
match ×1
php ×1
rust ×1
swift ×1