switch

伊藤岳史設計的交換機

Switch交換機,它的前身是網橋SWITCH速度比HUB快,這是由於HUB不知道目標地址在何處,發送數據到所有的埠。交換機是使用硬體來完成以往網橋使用軟體來完成過濾、學習和轉發過程的任務。SWITCH中有一張轉發表,如果知道目標地址在何處,就把數據發送到指定地點,如果它不知道就發送到所有的埠。這樣過濾可以幫助降低整個網路的數據傳輸量,提高效率。以switch命名的還有動畫以及漫畫作品。

專業術語


交換機

switch
switch
當然交換機的功能還不止如此,它可以把網路拆解成網路分支、分割網路數據流,隔離分支中發生的故障,這樣就可以減少每個網路分支的數據信息流量而使每個網路更有效,提高整個網路效率。目前有使用SWITCH代替HUB的趨勢。
在計算機網路系統中,交換概念的提出改進了共享工作模式。而HUB集線器就是一種共享設備,HUB本身不能識別目的地址,當同一區域網內的A主機給B主機傳輸數據時,數據包在以HUB為架構的網路上是以廣播方式傳輸的,由每一台終端通過驗證數據包頭的地址信息來確定是否接收。也就是說,在這種工作方式下,同一時刻網路上只能傳輸一組數據幀的通訊,如果發生碰撞還得重試。這種方式就是共享網路帶寬。通俗的說,普通交換機是不帶管理功能的,一根進線,其他介面接到電腦上就可以了。
工作在數據鏈路層,交換機擁有一條很高帶寬的背部匯流排和內部交換矩陣。交換機的所有的埠都掛接在這條背部匯流排上,控制電路收到數據包以後,處理埠會查找內存中的地址對照表以確定目的MAC(網卡的硬體地址)的NIC(網卡)掛接在哪個埠上,通過內部交換矩陣迅速將數據包傳送到目的埠,目的MAC若不存在,廣播到所有的埠,接收埠回應后交換機會“學習”新的地址,並把它添加入內部MAC地址表中。使用交換機也可以把網路“分段”,通過對照IP地址表,交換機只允許必要的網路流量通過交換機。通過交換機的過濾和轉發,可以有效的減少衝突域,但它不能劃分網路層廣播,即廣播域。交換機在同一時刻可進行多個埠對之間的數據傳輸。每一埠都可視為獨立的網段,連接在其上的網路設備獨自享有全部的帶寬,無須同其他設備競爭使用。當節點A向節點D發送數據時,節點B可同時向節點C發送數據,而且這兩個傳輸都享有網路的全部帶寬,都有著自己的虛擬連接。假使這裡使用的是10Mbps的乙太網交換機,那麼該交換機這時的總流通量就等於2×10Mbps=20Mbps,而使用10Mbps的共享式HUB時,一個HUB的總流通量也不會超出10Mbps。總之,交換機是一種基於MAC地址識別,能完成封裝轉發數據幀功能的網路設備。交換機可以“學習”MAC地址,並把其存放在內部地址表中,通過在數據幀的始發者和目標接收者之間建立臨時的交換路徑,使數據幀直接由源地址到達目的地址。

語句

如果希望選擇執行若干代碼塊中的一個,你可以使用 switch 語句:
語法:
switch (n)
{ case 1: 執行代碼塊1 break
case 2: 執行代碼塊2 break
default: 如果n即不是1也不是2,則執行此代碼 }
switch (n) { case 1: 執行代碼塊1 break
case 2: 執行代碼塊2 break
default: 如果n即不是1也不是2,則執行此代碼 }
工作原理:switch 後面的 (n) 可以是表達式,也可以(並通常)是變數。然後表達式中的值會與 case 中的數字作比較,如果與某個 case 相匹配,那麼其後的代碼就會被執行。break的作用是防止代碼自動執行到下一行。
實例:
//Monday=1, Tuesday=2, etc.var d=new Date()theDay=d.getDay()switch (theDay)
{ case 5: document.write("Finally Friday") break case 6:
document.write("Super Saturday") break case 0:
document.write("Sleepy Sunday") break default:
document.write("I'm looking forward to this weekend!")}
switch 語句和具有同樣表達式的一系列的 IF 語句相似。很多場合下需要把同一個變數(或表達式)與很多不同的值比較,並根據它等於哪個值來執行不同的代碼。這正是 switch 語句的用途。
註:注意和其它語言不同,continue 語句作用到 switch 上的作用類似於 break。如果在循環中有一個 switch 並希望 continue 到外層循環中的下一個輪迴,用 continue 2。
下面兩個例子使用兩種不同方法實現同樣的事,一個用一系列的 if 語句,另一個用 switch 語句:例子 16-1. switch結構
?
if ($i == 0) {
echo "i equals 0";
} elseif ($i == 1) {
echo "i equals 1";
} elseif ($i == 2) {
echo "i equals 2";
}
switch ($i) {
case 0:
echo "i equals 0";
break;
case 1:
echo "i equals 1";
break;
case 2:
echo "i equals 2";
break;
}
?>例子 16-2. switch結構可以用字元串
switch ($i) {
case "apple":
echo "i is apple";
break;
case "bar":
echo "i is bar";
break;
case "cake":
echo "i is cake";
break;
}
?>為避免錯誤,理解 switch 是怎樣執行的非常重要。switch 語句一行接一行地執行(實際上是語句接語句)。開始時沒有代碼被執行。僅當一個 case 語句中的值和 switch 表達式的值匹配時 php 才開始執行語句,直到 switch 的程序段結束或者遇到第一個 break 語句為止。如果不在 case 的語句段最後寫上 break 的話,php 將繼續執行下一個 case 中的語句段。例如:
switch ($i) {
case 0:
echo "i equals 0";
case 1:
echo "i equals 1";
case 2:
echo "i equals 2";
}
?>
這裡如果 $i 等於 0,php 將執行所有的 print 語句!如果 $i 等於 1,php 將執行後面兩條 print 語句。只有當 $i 等於 2 時,才會得到“預期”的結果――只顯示“i equals 2”。所以,別忘了 break 語句就很重要(即使在某些情況下故意想避免提供它們時)。
在 switch 語句中條件只求值一次並用來和每個 case 語句比較。在 elseif 語句中條件會再次求值。如果條件比一個簡單的比較要複雜得多或者在一個很多次的循環中,那麼用 switch 語句可能會快一些。
在一個 case 中的語句也可以為空,這樣只不過將控制轉移到了下一個 case 中的語句。
switch ($i) {
case 0:
case 1:
case 2:
echo "i is less than 3 but not negative";
break;
case 3:
echo "i is 3";
}
?>
一個 case 的特例是 default。它匹配了任何和其它 case 都不匹配的情況,並且應該是最後一條 case 語句。例如:
switch ($i) {
case 0:
echo "i equals 0";
break;
case 1:
echo "i equals 1";
break;
case 2:
echo "i equals 2";
break;
default:
echo "i is not equal to 0, 1 or 2";
}
?>
case 表達式可以是任何求值為簡單類型的表達式,即整型或浮點數以及字元串。不能用數組或對象,除非它們被解除引用成為簡單類型。
switch 支持替代語法的流程式控制制。更多信息見流程式控制制的替代語法一節。
switch ($i):
case 0:
echo "i equals 0";
break;
case 1:
echo "i equals 1";
break;
case 2:
echo "i equals 2";
break;
default:
echo "i is not equal to 0, 1 or 2";
endswitch;
?>

C語言程序語

Switch用在編程中,如C語言中它經常跟Case一起使用,是一個判斷選擇代碼。其功能就是控制業務流程流轉的。
直線翻譯:switch語句,即“切換”語句;case即“情況”。
switch語句的語法如下(switch,case和default是關鍵字):
switch ( controllingExpression )
{
case constantExpression1 :
case constantExpression2 :
case constantExpression3 :
statements; 
break;
case constantExpression :
statements ;
break;
...
default :
statements ;
break;
}
遵守switch語句規則
switch語句非常有用,但在使用時必須謹慎。所寫的任何switch語句都必須遵循以下規則:
只能針對基本數據類型使用switch,這些類型包括int、char等。對於其他類型,則必須使用if語句。
switch()的參數類型不能為實型。
case標籤必須是常量表達式(constantExpression),如42或者"42"。
case標籤必須是惟一性的表達式;也就是說,不允許兩個case具有相同的值。
C語言switch應用例子:
例一:
#include
int main()
{
double score;
printf("請輸入分數:\n");
scanf("%lf",&score);
switch((int)(score/10))//switch((int)score/10)出現嚴重錯誤
{
case 10:
case 9:printf("A(最好)\n");break;
case 8:printf("B(優秀)\n");break;
case 7:printf("C(良好)\n");break;
case 6:printf("D(及格)\n");break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:printf("E(不及格)\n");break;
default:printf("Error!\n");
}
}
例二:
#include
int main()
{
char rank;
printf("請輸入分數等級:(A、B、C、D、E)\n");
scanf("%c",&rank);
switch(rank)//switch((int)score/10)出現嚴重錯誤,switch(((int)score)/10)出現嚴重錯誤,
{
case 'A':printf("A(90~100)\n");break;
case 'B':printf("B(80~89)\n");break;
case 'C':printf("C(70~79)\n");break;
case 'D':printf("D(60~69)\n");break;
case 'E':printf("E(0~59)\n");break;
default:printf("error!\n");break;
}
}
例三:
輸入年月日,判斷這一天是這一年的第幾天。
#include
int main()
{
int year,month,date,leap,days=0;
scanf("%4d%2d%2d",&year,&month,&date);
leap=(year%4==0&&year%100!=0||year%400==0);
switch(month)
{
case 12:days+=30;
case 11:days+=31;
case 10:days+=30;
case 9:days+=31;
case 8:days+=31;
case 7:days+=30;
case 6:days+=31;
case 5:days+=30;
case 4:days+=31;
case 3:days+=28+leap;
case 2:days+=31;
case 1:days+=date;break;
}
printf("%4d年%2d月%2d日是這一年的第%d天。\n",year,month,date,days);
}
PHP Switch 語句
如果您希望有選擇地執行若干代碼塊之一,請使用 Switch 語句。
使用 Switch 語句可以避免冗長的 if..elseif..else 代碼塊。
語法
switch (expression)
{
case label1:
code to be executed if expression = label1;
break;
case label2:
code to be executed if expression = label2;
break;
default:
code to be executed
if expression is different
from both label1 and label2;
}
工作原理:
對表達式(通常是變數)進行一次計算
把表達式的值與結構中 case 的值進行比較
如果存在匹配,則執行與 case 關聯的代碼
代碼執行后,break語句阻止代碼跳入下一個 case 中繼續執行
如果沒有 case 為真,則使用default語句
switch語句注意事項
switch(exprl){
case expr2:
statements;
break;
case expr3:
statements;
break;
default:
statements;
break;
}
switch語句執行時會從上到下根據括弧中表達式的值作比較,當某個case語句中的表達式與此值相同時,就執行這個case語句或語句序列,直到遇到break為止。 break語句是必須有的,它用來結束switch語句的執行。如果所有case語句後面的表達式都不等於switch語句的表達式expr1的值川0執行default後面的默認語句序列。不過,default部分是可選的。如果沒有這一部分,並遇到所有case語句都不匹配,那麼,就不作任何處理而進入後續程序段的執行。
可見,一個switch語句可以代替多個if-else語句組成的分支結構,而switch語句從思路上顯得更清晰。
使用switch語句時,要注意expr1必須是符合byte,char,short,int類型的常量表達式,而不能用浮點類型或long類型,也不能為一個字元串。
1 switch(colorNum){
2 case 0:
3 setBackground(colo. red);
4 break;
5 case 1:
6 setBackground(color.green) ;
7 break;
8 default:
9 setBackground(color.black);
10 break;
11 }
switch還有一個用法:
1 switch(colorNum){
2 case 0:
3 case 1:
4 setBackground(color.green) ;
5 break;
6 default:
7 setBackground(color.black);
8 break;
9 }