2016-02-15 30 views
1

我知道這之前已經散列出來,我讀過的每一個問題,並回答開關,我可以找到。我的問題不是關於達夫設備的語法或功能,而是關於一般情況下的切換,這恰好說明了這個問題。switch語句傻了眼

{ 
    int 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); 
    } 

我明白了這一點,n的值隨着每次迭代而遞減。我也明白,鬆散的編譯器規則允許其他情況跳轉到do循環中(奇怪但我理解它)

但由於switch語句是(count%8)的函數,並且沒有任何內容在更改計數爲什麼計數首先在開關內產生不同的模餘數?

假設(計數%8)在所述第一通產生7。處理情況7:計數值保持不變,因此(計數%8)的值應該保持不變,因此情況6:不應該爲真,也不應該有任何其他情況並且沒有缺省值n應該遞減,並且do循環的下一次迭代應該始於計數值不變。所以看起來循環會減少到0,count永遠不會改變,所以它只會執行第7種情況,使所有其他代碼無意義。

但是,如果那是真的,那麼達夫的設備將無法工作,因爲它顯然依賴於int(n + 7)/ 8來產生8個重複值,每個值的計數值爲n並且與(計數%8)配對意味着該計數確實遞減以產生7到0之間遞減的模餘數的循環。

從我的新手角度來看,這似乎工作,將需要一個--count在該循環某處。所以我的結論是,我不明白交換機是如何工作的。我會很感激任何解釋。

回答

0

做各種版本的一個小測試,我可以肯定地說,計數不改變值後,只有n的變化值。當然,這意味着原始代碼在沒有切換的情況下可以完全一樣地工作,只需在do內部連續執行8次賦值操作:雖然這讓我想知道在這種情況下開關的重點是什麼,除了純粹的混淆。

至於開關是如何工作的,我已經通過它的工作原理基本上是如我所料,除了它,除非您在各種情況下休息,無論價值執行各種情況下的測試才能發現。進一步的證據顯示,伯爵沒有改變,因爲達夫法典中沒有中斷,加上伯爵的不變價值,這進一步證明了這種轉變完全沒有意義。

這會產生完全相同的結果;

{ 
//integer division by 8 produces 8 iterations of the same value 
int n = (count + 7)/8; 

do { 
    *to++ = *from++; //therefore since the loop will be 1/8th 
    *to++ = *from++; 
    *to++ = *from++; //the value of count you need to perform 
    *to++ = *from++; 
    *to++ = *from++; //8 assignments per iteration of n 
    *to++ = *from++; 
    *to++ = *from++; //this produces the same result without 
    *to++ = *from++; 
    *to++ = *from++; //the switch 
} while(--n > 0); 

}