如何使用C将带有2个变量的IF语句转换为开关函数?

Tia*_* C. 0 c variables if-statement switch-statement

我有一个IF语句,我想转换成一个Switch语句......但它有2个变量!是否可以在C上进行?

这是一个摇滚,纸,剪刀游戏:

(R代表岩石,P代表纸张,S代表剪刀)

     char play1, play2;

     printf("\nPlayer 1 - Enter your Play: ");
     scanf ("%c", &play1);
     printf("\nPlayer 2 - Enter your Play: ");
     scanf (" %c", &play2); 


     if (play1 == 'R' && play2 == 'P') {
       printf ("Paper wins!"); }
      else if (play1 == 'R' && play2 == 'S') {
        printf ("Rock wins!");}
      else if (play1 == 'R' && play2 == 'R) {
        printf ("Draw!");}
Run Code Online (Sandbox Code Playgroud)

我必须为其他选项做这个,所以最好使用开关!

Dav*_*eri 9

#include <stdio.h>

#define SWITCH(a, b) char _a = a; char _b = b; if (0)
#define CASE(a, b) } else if ((a == _a) && (b == _b)) {

int main(void)
{
    char play1, play2;

    printf("\nPlayer 1 - Enter your Play:");
    scanf ("%c", &play1);
    getchar();
    printf("\nPlayer 2 - Enter your Play:");
    scanf ("%c", &play2);
    getchar();

    SWITCH(play1, play2) {
        CASE('R','P') printf ("Paper wins!");
        CASE('R','S') printf ("Rock wins!");
        CASE('R','R') printf ("Draw!");
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是一个笑话:P

编辑:案例支持":"

#define PASTE(a, b) a##b
#define LABEL(a, b) PASTE(a, b)
#define SWITCH(a, b) char _a = a; char _b = b; if (0)
#define CASE(a, b) } else if ((a == _a) && (b == _b)) { LABEL(LBL, __LINE__)
Run Code Online (Sandbox Code Playgroud)

但不适用于:

CASE('R','R'): printf ("Draw a!"); CASE('S','R'): printf ("Draw!");
Run Code Online (Sandbox Code Playgroud)

两个案例在同一行

解决了使用:

#define SWITCH(a, b) char _a = a; char _b = b; if (0)
#define CASE(a, b) } else if ((a == _a) && (b == _b)) {switch(1) case 1
Run Code Online (Sandbox Code Playgroud)

希望没人用它:)

  • 这是一种可怕的方式. (5认同)

das*_*ght 6

一般来说,答案是"不":switch语句使用单个变量.但是,在某些情况下,您可以进行转换.例如,如果你有两个变量,a并且b,a可以是0,1或2,b那可以是0, 1, 2, or 3,你可以这样做一个开关:

switch (a*10+b) {
    case  0: break; // a == 0, b == 0
    case 10: break; // a == 1, b == 0
    case 20: break; // a == 2, b == 0
    case  1: break; // a == 0, b == 1
    case 11: break; // a == 1, b == 1
    case 21: break; // a == 2, b == 1
    case  2: break; // a == 0, b == 2
    case 12: break; // a == 1, b == 2
    case 22: break; // a == 2, b == 2
    case  3: break; // a == 0, b == 3
    case 13: break; // a == 1, b == 3
    case 23: break; // a == 2, b == 3
}
Run Code Online (Sandbox Code Playgroud)

  • 这太可怕了,+ 1! (4认同)