C++ Switch 语句在中断后执行

C++ Switch statement executes after break

本文关键字:执行 中断 Switch 语句 C++      更新时间:2023-10-16

我正在尝试编写一个C++程序来为剪刀布纸游戏评分。
两个用户中的每一个都键入 P、R 或 S。然后程序宣布获胜者以及确定获胜者的依据:(我必须使用 switch 语句,不能使用任何 if、if-else、else if 语句(

遇到的问题是我得到了 2 个输出,因为它在休息后执行。 例如剪刀剪纸。玩家 2 获胜!剪刀剪纸。玩家 1 获胜!

这是我的代码,提前感谢。

#include <iostream>
using namespace std;
int main()
{
char pl1;
char pl2;
cout << "Enter [R]ock, [P]aper, or [S]cissors" << endl;
cout << "Player 1: ";
cin>>pl1;
cout << "Enter [R]ock, [P]aper, or [S]cissors" << endl;
cout << "Player 2: ";
cin>>pl2;
switch (pl1)
{
    case 'R':
    case 'r':
    {
        switch(pl2)
            case 'P':
            case 'p':
        {
            cout << "Paper beats Rock." << endl;
            cout << "Player 2 WINS!" << endl;
            break;
        }
            case 'S':
            case 's':
        {
            cout << "Rock smashes Scissors." << endl;
            cout << "Player 1 WINS!" << endl;
            break;
        }
        break;
    }
    break;
}
switch (pl1)
{
    case 'P':
    case 'p':
    {
        switch(pl2)
            case 'R':
            case 'r':
        {
            cout << "Paper beats Rock." << endl;
            cout << "Player 1 WINS!" << endl;
            break;
        }
            case 'S':
            case 's':
        {
            cout << "Scissors cuts Paper." << endl;
            cout << "Player 2 WINS!" << endl;
            break;
        }
        break;
    }
    break;
}
switch (pl1)
{
    case 'S':
    case 's':
    {
        switch(pl2)
            case 'R':
            case 'r':
        {
            cout << "Rock smashes Scissors." << endl;
            cout << "Player 2 WINS!" << endl;
            break;
        }
            case 'P':
            case 'p':
        {
            cout << "Scissors cuts Paper." << endl;
            cout << "Player 1 WINS!" << endl;
            break;
        }
        break;
    }
    break;
}
switch (pl1)
{
    case 'R':
    case 'r':
    case 'P':
    case 'p':
    case 'S':
    case 's':
    {
        switch(pl2 == pl1)
        {
            case true:
            {
                cout<<"Nobody wins"<<endl;
                break;
            }
        }
        break;
    }
    break;
}
return 0;
}

基本问题是你错过了{......}某些 switch 语句的(预期(正文周围,导致除第一个情况之外的所有情况都成为封闭 switch 语句的一部分。 例如,您的第一个 coupound 开关:

switch (pl1)
{
    case 'R':
    case 'r':
    {
        switch(pl2)
            case 'P':
            case 'p':
        {
            cout << "Paper beats Rock." << endl;
            cout << "Player 2 WINS!" << endl;
            break;
        }
            case 'S':
            case 's':
        {
            cout << "Rock smashes Scissors." << endl;
            cout << "Player 1 WINS!" << endl;
            break;
        }
        break;
    }
    break;
}

实际上是(添加大括号和固定缩进(:

switch (pl1)
{
    case 'R':
    case 'r':
    {
        switch(pl2) {
            case 'P':
            case 'p':
            {
                cout << "Paper beats Rock." << endl;
                cout << "Player 2 WINS!" << endl;
                break;
            }
        }
    case 'S':
    case 's':
    {
        cout << "Rock smashes Scissors." << endl;
        cout << "Player 1 WINS!" << endl;
        break;
    }
    break;
    }
    break;
}

因此,使用输入'r''p',它会打印第一条消息,然后落入's'大小写并打印第二条消息......

最令人惊讶的是,即使使用 -Wall -Wextra,您也没有看到任何编译器警告 - 这绝对是编译器应该警告的事情。

删除所有代码

}
switch (pl1)
{

除了最后一个。

添加默认子句。

在打印胜利信息而不是休息时间后添加返回语句。

下面是按预期工作的代码版本。

#include <iostream>
using namespace std;
int main ()
{
    char pl1;
    char pl2;
    cout << "Enter [R]ock, [P]aper, or [S]cissors" << endl;
    cout << "Player 1: ";
    cin >> pl1;
    cout << "Enter [R]ock, [P]aper, or [S]cissors" << endl;
    cout << "Player 2: ";
    cin >> pl2;
    switch (pl1)
    {
        case 'R':
        case 'r':
        {
            switch (pl2)
            {
                case 'P':
                case 'p':
                {
                    cout << "Paper beats Rock." << endl;
                    cout << "Player 2 WINS!" << endl;
                    break;
                }
                case 'S':
                case 's':
                {
                    cout << "Rock smashes Scissors." << endl;
                    cout << "Player 1 WINS!" << endl;
                    break;
                }
            }
            break;
        }
        case 'P':
        case 'p':
        {
            switch (pl2)
            {
                case 'R':
                case 'r':
                {
                    cout << "Paper beats Rock." << endl;
                    cout << "Player 1 WINS!" << endl;
                    break;
                }
                case 'S':
                case 's':
                {
                    cout << "Scissors cuts Paper." << endl;
                    cout << "Player 2 WINS!" << endl;
                    break;
                }
            }
            break;
        }
        case 'S':
        case 's':
        {
            switch (pl2)
            {
                case 'R':
                case 'r':
                {
                    cout << "Rock smashes Scissors." << endl;
                    cout << "Player 2 WINS!" << endl;
                    break;
                }
                case 'P':
                case 'p':
                {
                    cout << "Scissors cuts Paper." << endl;
                    cout << "Player 1 WINS!" << endl;
                    break;
                }
            }
            break;
        }
    }
    switch (pl2 == pl1)
    {
        case true:
            cout << "Nobody wins" << endl;
            break;
    }
}

您犯的主要错误是忘记为内部switch(pl2)块添加示波器,从而导致双重射击。