你能解读这个switch()和()的等价物之间的区别吗?

j r*_*riv 1 c

这个按预期工作:

    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;
Run Code Online (Sandbox Code Playgroud)

但是这一个,

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;
Run Code Online (Sandbox Code Playgroud)

..有时候"失去它",如果某些"鼠标按钮"(在那段代码中)被按下时速度太快就不会被按下.

无论如何,我猜代码本身的相关性很小.

为什么这些代码片段不能完全相同?

Shi*_*zou 8

开关就像写作

if ( clu.raw.buts[i] == VALUE )
Run Code Online (Sandbox Code Playgroud)

这与...不同

if ( clu.raw.buts[i] & VALUE ) 
Run Code Online (Sandbox Code Playgroud)

显然,第一个"捕获"值如果它是唯一保留的事件clu.raw.buts[i].相反,所有RI_stuff都是位或者是clu.raw.buts[i],因此查看它们是设置(1)还是清除(0)的唯一方法是&(按位和)运算符.

例如,如果clu.raw.buts[i]是0100且VALUE是0100,则可以捕获它.如果clu.raw.buts[i]是0110,你将不会"看到"带有==的0100,而你将"看到"它& 0100.