2010-07-18 67 views
1

這一次按預期工作:你能解釋這個switch()和()的一個等價物之間的區別嗎?

if (clu.raw.butsnum) { 
     int i; 
     for (i=0;i<clu.raw.butsnum;i++){ 
      if (clu.raw.buts[i] & RI_MOUSE_BUTTON_1_DOWN) 
       Com_QueueEvent(0, SE_KEY, K_MOUSE1, qtrue, 0, NULL); 
      if (clu.raw.buts[i] & RI_MOUSE_BUTTON_2_DOWN) 
       Com_QueueEvent(0, SE_KEY, K_MOUSE2, qtrue, 0, NULL); 
      if (clu.raw.buts[i] & RI_MOUSE_BUTTON_3_DOWN) 
       Com_QueueEvent(0, SE_KEY, K_MOUSE3, qtrue, 0, NULL); 
      if (clu.raw.buts[i] & RI_MOUSE_BUTTON_4_DOWN) 
       Com_QueueEvent(0, SE_KEY, K_MOUSE4, qtrue, 0, NULL); 
      if (clu.raw.buts[i] & RI_MOUSE_BUTTON_5_DOWN) 
       Com_QueueEvent(0, SE_KEY, K_MOUSE5, qtrue, 0, NULL); 
      if (clu.raw.buts[i] & RI_MOUSE_BUTTON_1_UP) 
       Com_QueueEvent(0, SE_KEY, K_MOUSE1, qfalse, 0, NULL); 
      if (clu.raw.buts[i] & RI_MOUSE_BUTTON_2_UP) 
       Com_QueueEvent(0, SE_KEY, K_MOUSE2, qfalse, 0, NULL); 
      if (clu.raw.buts[i] & RI_MOUSE_BUTTON_3_UP) 
       Com_QueueEvent(0, SE_KEY, K_MOUSE3, qfalse, 0, NULL); 
      if (clu.raw.buts[i] & RI_MOUSE_BUTTON_4_UP) 
       Com_QueueEvent(0, SE_KEY, K_MOUSE4, qfalse, 0, NULL); 
      if (clu.raw.buts[i] & RI_MOUSE_BUTTON_5_UP) 
       Com_QueueEvent(0, SE_KEY, K_MOUSE5, qfalse, 0, NULL); 
     } 
     clu.raw.butsnum = 0; 

但是這一次,

if (clu.raw.butsnum) { 
     short int down  = qfalse; 
     int   but = 0, i; 

     for (i = 0; i < clu.raw.butsnum; i++) { 
      switch(clu.raw.buts[i]) { 
       case  RI_MOUSE_BUTTON_1_DOWN:  down = qtrue; but = K_MOUSE1; break; 
       case  RI_MOUSE_BUTTON_2_DOWN:  down = qtrue; but = K_MOUSE2; break; 
       case  RI_MOUSE_BUTTON_3_DOWN:  down = qtrue; but = K_MOUSE3; break; 
       case  RI_MOUSE_BUTTON_4_DOWN:  down = qtrue; but = K_MOUSE4; break; 
       case  RI_MOUSE_BUTTON_5_DOWN:  down = qtrue; but = K_MOUSE5; break; 
       case  RI_MOUSE_BUTTON_1_UP:  down = qfalse; but = K_MOUSE1; break; 
       case  RI_MOUSE_BUTTON_2_UP:  down = qfalse; but = K_MOUSE2; break; 
       case  RI_MOUSE_BUTTON_3_UP:  down = qfalse; but = K_MOUSE3; break; 
       case  RI_MOUSE_BUTTON_4_UP:  down = qfalse; but = K_MOUSE4; break; 
       case  RI_MOUSE_BUTTON_5_UP:  down = qfalse; but = K_MOUSE5; break; 
      } 
      Com_QueueEvent(0, SE_KEY, but, down, 0, NULL); 
     } 
    } 
    clu.raw.butsnum = 0; 

..sometimes「失去它」,如果某些「鼠標鍵」(在代碼)都沒有如果它們被擊得太快,就會被壓。

無論如何,我認爲代碼本身的相關性不大。

爲什麼那些代碼不會做完全相同的事情?

回答

8

開關類似於寫

if (clu.raw.buts[i] == VALUE) 

其是從

if (clu.raw.buts[i] & VALUE) 

不同顯然,第一「抓」 VALUE當且僅當它是唯一的事件保持在clu.raw.buts[i]。相反,所有RI_stuffs都是clu.raw.buts[i]中的位,因此要查看它們是否設置爲(1)或清除(0)的唯一方法是&(按位運算符)。

E.g.如果clu.raw.buts[i]是0100而VALUE是0100,那麼你可以捕獲它。如果clu.raw.buts[i]是0110,您將不會用==看到0100,而您將用& 0100「看到」它。

3

通過使用二進制AND運算符並單獨檢查每個位,代碼#1允許clu.raw.buts[i]條目中的多個位爲1

代碼#2只允許一個位爲1(因爲它比較特定case價值在select),從而丟失了兩個或更多個事件發生一次的情況。

3

隨着if的,你正在檢查每個單獨的位。有了這個開關,你就可以有效地查看所有的位或者一起,所以沒有任何個案遇到過。

1

使用開關版本,每次迭代只能匹配一個案例。在if版本中,每個語句都會依次進行評估,這意味着每個迭代都可以執行多個語句。

相關問題