2013-01-16 42 views
2
#include <iostream> 
#include <sstream> 

int main(int argc, char* argv[]) { 
if (argc != 2) { 
std::cout << "usage: " << argv[0] << " <n> " << std::endl; 
return 0; 
} 
std::stringstream strm; 
strm << argv[1]; 
int count = 0; 
int number; 
strm >> number; 
switch (number) { 
case 0: ++count; 
case 1: ++count; 
case 2: ++count; 
case 3: ++count; 
case 4: ++count; 
} 

    std::cout << "count: " << count << std::endl; 
    return 0; 
} 

我知道這是一個新手問題,但我剛剛開始使用C++。我參加了一個遊戲設計課程,這是教授在SVN上的第一個例子。當我運行編譯後的PROG,C++ switch語句,這是如何工作的

./run 4 (即我給參數4)我得到一個輸出:計數:1

./run 3 我得到一個輸出:計數:2

./run 1 計數:4

./run 0 計數:5

由於計數被初始化爲0,如何來./run 1給出4或./run 0給定計數5

對於這樣一個愚蠢的問題,我真的很抱歉,但是我會很感激任何解釋。

由於提前 問候

回答

10

隨着switch聲明,當控制傳遞給case標籤,代碼將繼續通過所有其他case標籤,直到breakreturn(或其他流量控制機制)是遇到。這對統一特定案例的邏輯很有用,也可以用於更復雜的任務。請參閱:a Duff's Device.

+0

謝謝,唉! 「休息」是的!我剛剛在C++書籍上閱讀了一篇文章。希望我很快會提出更好的問題。謝謝 – user1772218

+0

Upvote提到達夫的設備;) –

+0

是的,這是switch語句的一個典型的突破問題。有語法檢查器可以檢測到這一點,因爲它經常(但並非總是)一個錯誤。但是,如果您的值需要稍微不同的操作,則可以非常方便地使用轉換。 –

3

switch語句定義了輸入一組代碼的位置。

switch (number) { 
case 0: ++count; //entrance point with number= 0 
case 1: ++count; //entrance point with number= 1 
case 2: ++count; //entrance point with number= 2 
case 3: ++count; //entrance point with number= 3 
case 4: ++count; //entrance point with number= 4 
} 

本質上,除了到達開關末端外,沒有任何退出。但是,可以添加「break」。語句中任何地方的語句,以使代碼提前退出交換機(或超出範圍)。

此外,但是稍微偏離主題,關鍵字「default」應該用在case語句中。當數字沒有定義的情況下,將調用默認關鍵字。例如,使用上述案例,是否有人向案件發送了6號。

+0

關於默認的好處。 我們使用g ++ 4.5.2和-Wall它會警告你有一個枚舉類型,因爲你的開關是可變的,並且所有的定義值都不在case語句中。默認會安靜這個警告。 –