循环时爆发

时间:2017-04-21 11:40:58

标签: c

这是主要功能,其中还有9个函数被调用。我会告诉你另一个功能,以了解我的目标是什么。

int main() {
    char B[rows][columns];
    char answer;
    int newgame;
    printf("Are you ready to play? Answer with y (or Y) for yes or n (or N) for no\n");
    scanf("\n%c",&answer);
    while(answer!='N' && answer!='n'){
        fillArray(B);
        printArray(B);
        answer='y';
        while(answer!='N' && answer!='n'){
            vasilhs(B);
            printArray(B);
            check_draw(B);//I will place an if statement after the check_draw function
            check_vertical_win(B);
            check_horizontal_win(B);
            check_right_diagonal_win(B);
            check_left_diagonal_win(B);
            antipalos_paikths(B);
            printArray(B);
            check_draw(B);
            check_vertical_win(B);
            check_horizontal_win(B);
            check_right_diagonal_win(B);
            check_left_diagonal_win(B);
        }
        printf("Do you want to play again?\n");
        scanf("\n\n%c",&answer);
    }
    }//end of main function
    //function check_draw

    void check_draw(char A[rows][columns]){
    int i,j;
    int newgame;
    //if statement will check in an matrix if the following elements are equal to '-'
    if(A[0][0]!='-' && A[0][1]!='-' && A[0][2]!='-' && A[0][3]!='-' && A[0][4]!='-' && A[0][5]!='-' && A[0][6]!='-'){
        printf("The result is a draw");
        newgame=10;
    }
}

因此,当函数check_draw中的if语句为True时,变量newgame得到值10。

if(newgame==10){
    break;
}

为什么,当我在check_draw调用之后放置这个if语句时,它是否会破坏while循环?

2 个答案:

答案 0 :(得分:0)

从您的代码实现:

void check_draw(char A[rows][columns]){
    int i, j;
    int newgame;
    //if statement will check in an matrix if the following elements are equal to '-'
    if (A[0][0] != '-' && A[0][1] != '-' && A[0][2] != '-' && A[0][3] != '-' && A[0][4] != '-' && A[0][5] != '-' && A[0][6] != '-'){
        printf("The result is a draw");
        newgame = 10;
    }
}

int newgame这是check_draw函数的本地副本。

如果另一个具有相同名称的变量作为全局变量存在,那么您不应在int newgame函数中声明check_draw。它将使本地副本可以使用。

建议:

int newgame;// Write it outside main
void check_draw(char A[rows][columns]){
    int i, j;   
    //if statement will check in an matrix if the following elements are equal to '-'
    if (A[0][0] != '-' && A[0][1] != '-' && A[0][2] != '-' && A[0][3] != '-' && A[0][4] != '-' && A[0][5] != '-' && A[0][6] != '-'){
        printf("The result is a draw");
        newgame = 10;
    }
}

如果您在int newgame;函数内部写check_draw而不在newgame = 10;函数内创建任何本地副本,则check_draw函数中的newgame语句将更改全局{{1}的值}。

答案 1 :(得分:0)

变量newgame在函数check_draw中再次定义 ,因此它是{{> 本地副本 的{{ 1}} check_draw 无法访问

假设变量mainrows在此处未显示的部分代码中正确声明和初始化,一种解决方案是将columns的值返回到{ {1}}并删除' main'中的声明:

newgame

另一种解决方案是将main的变量int main() { char B[rows][columns]; char answer; int result; printf("Are you ready to play? Answer with y (or Y) for yes or n (or N) for no\n"); scanf("\n%c",&answer); while(answer!='N' && answer!='n'){ fillArray(B); printArray(B); answer='y'; while(answer!='N' && answer!='n'){ result = check_draw(B); } printf("Do you want to play again?\n"); scanf("\n\n%c",&answer); } }//end of main function //function check_draw int check_draw(char A[rows][columns]){ int i,j; int newgame = -1; //if statement will check in an matrix if the following elements are equal to '-' if(A[0][0]!='-' && A[0][1]!='-' && A[0][2]!='-' && A[0][3]!='-' && A[0][4]!='-' && A[0][5]!='-' && A[0][6]!='-'){ printf("The result is a draw"); newgame=10; } return newgame; } 作为指针传递并删除main中的声明:

newgame

请阅读Basic Authentication关于本地变量'范围。另请查看this link