Friday, 15 February 2019

浅谈 switch

新手要了解编程的 switch 很简单。

就好像一个人选择上电梯,抵达总共五层楼的其中一层,从窗口跳楼。

switch (按电梯):
--------餐厅楼(最高楼):
--------
--------办公楼:
--------
--------电梯号码不符合的楼:
--------
--------观光楼:
----------------阳台。
--------住家楼:
----------------阳台。
--------商场楼 (第一楼):
--------

假设窗口在阳台正上方。

如果那人电梯到达顶楼, i.e. 餐厅楼,开始跳楼就会经过餐厅楼,办公楼,”电梯号码不符合的楼“,最后掉在观光楼的阳台而已。人不会穿过阳台一直掉下去。

如果那人电梯到达住家楼,开始跳楼就会直接掉在住家楼的阳台而已。

第一楼有没有阳台都一样。窗口跳下去就是直接结束。

”电梯号码不符合的楼“ 是很恐怖的楼,表示只要按电梯号码,然后那个号码不属于餐厅楼, 不属于办公楼,不属于观光楼,不属于住家楼,不属于商场楼,就会抵达那层幽灵楼。

换成程序语言就是:

switch (按电梯):
--------case 餐厅楼(最高楼):
--------
--------case 办公楼:
--------
--------default:
--------
--------case 观光楼:
------------- break;
-------- case 住家楼:
------------- break;
-------- case 商场楼 (第一楼):
--------

上楼不会执行代码, 但是跳楼后每经过一层楼就会执行该楼的代码。

初学者容易混淆的错误是以为掉落的时候, 每经过一层楼后还有飞行能力重新搭电梯去其他楼。不能,switch 只有一次机会搭电梯上楼, 然后一条命跳楼到阳台或最下面的楼 【#注1】。 所以以下这个代码不会执行 lala3 楼的代码:


-------int lala;
-------lala = 4;
-------switch (lala) {
-------------- default:
---------------------System.out.println("lala: " + lala);
---------------------lala = 3; //will jump down, will not re-examine again then go to case 3
-------------- case 2:
--------------------- System.out.println("lala2: " + lala);
--------------------- break;
--------------case 3:
---------------------System.out.println("lala3: " + lala);
------- }

另一个容易混淆的是 default 的真正意思。default 其实就是幽灵楼 👻,不是最底层的楼 (很多代码例子都是放在最下面, 造成误解), 也不是非得有的楼 (可以不放 `default:`, 那人按电梯没有反应, 上不到楼, 所以放弃跳楼 ), 也不是跳楼经过幽灵楼就不会继续往下掉 (不是最后的楼)。

#注1: 除了 c/c++ 的特别魔法,可以利用 while 飞回去那层楼 (不是重新搭电梯, 电梯号码不会 re-examine), http://www.drdobbs.com/a-reusable-duff-device/184406208

int i = 6;
switch(i)
{
--------------while(i > -10)
--------------{
-------------- case 0: printf("0\n");
----------------------------print(); i--;
-------------- case 7: print(); i--;
-------------- case 6:
----------------------------printf("6\n");
----------------------------print(); i--;
-------------- case 5: print(); i--;
-------------- case 4: print(); i--;
-------------- case 3: print(); i++; //i 是 4, 但不会 re-examine 去 case 4 而是飞回去 while 的 case 0 那楼, 重新跳楼。
--------------}
}

这里有两种 break:

switch(i) {
------------- while(i > -10) {
--------------------- case 0:
---------------------------------- break; //break switch
--------------------- break; //break while
------------- }
}


#注2: 此文主要是说 java/C/C++, 不过不是每个语言都采用跳楼论(fall through), https://stackoverflow.com/…/is-there-programming-language-w…


希望帮到初学者, 我程度不高只能写些初学者的教程。