switch語法的盲點

switch語法在項目使用的頻率很低,今天看到一個相關的例子引發一些思考,,同時自己也寫了一些簡單的例子如下:

    實例1:

int dayOfWeek = 5;
		switch (dayOfWeek){
			default:
				System.out.println("default");
			case 1:
				System.out.println("1111");
			case 2:
				System.out.println("2222");
			case 4:
				System.out.println("3333");
		}

  運行結果:

default
1111
2222
3333

  實例2:

int dayOfWeek = 5;
		switch (dayOfWeek){
			default:
				System.out.println("default");
			case 1:
				System.out.println("1111");
			case 2:
				System.out.println("2222");
			//diff
			case 5:
				System.out.println("3333");
		}

  運行結果:

3333

  實例3:

int dayOfWeek = 5;
		switch (dayOfWeek){
			case 1:
				System.out.println("1111");
			//diff
			case 5:
				System.out.println("5555");
			case 2:
				System.out.println("2222");
			default:
				System.out.println("default");

		}

  運行結果:

5555
2222
default

  爲了弄清楚這是怎麼回事,首先從JDK文檔入手。從文檔可以瞭解一下幾點。

https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.11

1.如果switch表達式中的值與case常量其中一個相等,可以說與case的標籤是匹配的,在switch塊中,在當前匹配的case的後面的語句,不管是否匹配都將會執行。
2.如果沒有與case標籤相匹配的,但是存在default標籤,在switch塊中,default以及default後面的語句都將會順序執行。
3.既沒有case標籤匹配也沒有default標籤,switch中的語句將不會執行。

實例1對應情況是2,實例3對應情況3.

如何來避免這種情況?使用break。

繼續看一下其他語言的情況。

一、JavaScript

var dayOfWeek = 5
                switch (dayOfWeek){
                    default:
                       console.log("default javascript")
                    case 1:
                       console.log("1111")
                    case 2:
                        console.log("2222")
                    case 4:
                        console.log("4444")
                } 

  運行結果:

default javascript
1111
2222
4444

  

var dayOfWeek = 2
                switch (dayOfWeek){
                    
                    case 1:
                       console.log("1111")
                    case 2:
                        console.log("2222")
                    case 4:
                        console.log("4444")
                    default:
                       console.log("default javascript")
                } 

  運行結果:

2222
4444
default javascript

  二、C

int day_week = 5;
    switch(day_week){
        default : printf("%s\n", "default c");
        case 1: printf("%s\n", "1111");
        case 2: printf("%s\n", "2222");
        case 3: printf("%s\n", "3333");

    }

  運行結果:

default c
1111
2222
3333

  

int day_week = 2;
    switch(day_week){
        case 1: printf("%s\n", "1111");
        case 2: printf("%s\n", "2222");
        case 3: printf("%s\n", "3333");
        default : printf("%s\n", "default c");
    }

  運行結果:

2222
3333
default c

  三、Python並沒有switch

Why isn’t there a switch or case statement in Python?

You can do this easily enough with a sequence of if... elif... elif... else. There have been some proposals for switch statement syntax, but there is no consensus (yet) on whether and how to do range tests. See PEP 275 for complete details and the current status.

鏈接https://docs.python.org/2/faq/design.html#why-isn-t-there-a-switch-or-case-statement-in-python

 

總結

  這些語言對switch的詞法分析都是一樣的。switch這東西用的少,但是用的時候不要忘了break。

  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章