如果char数组的语句不能正常工作

Mit*_*ner 0 c++ arrays loops multidimensional-array minesweeper

所以我创建了一个void函数,它应该为一个2D数组赋值178.然后我创建了一个if语句,检查这个数组是否不等于178,如果它不相等,那么计数器(int变量stevec)增加1.运行调试器我发现这个条件总是正确的,但它不应该,因为数组中的所有值在开头都等于178.我也声明了char matrix [10] [10] = {}; 在最开始的所有功能之外.

   void set_matrix_to_default()
{
    for(int y=1; y<=9; y++)
    {
        for(int x=1; x<=9; x++)
        {
            matrix[x][y]=178;
        }
    }
}

void Check_Win()
{
    int stevec=0;
    for(int y=1; y<=9; y++)
    {
        for(int x=1; x<=9; x++)
        {
            if(matrix[x][y]!=178)
            {
                stevec++;

            }
            else
            {
            }
        }
    }
    if(stevec==9*9)
    {
        cout<<"Konec igre, zmagal si!";
        exit(0);
    }
    else {}
}
Run Code Online (Sandbox Code Playgroud)

pad*_*ddy 5

默认情况下,char是签名类型.在典型的char8位比特系统上,这意味着它无法保存该值178.当你尝试进行这种比较时,matrix[x][y]会被提升为int负面.

最明智的选择是将matrix类型更改为unsigned char(或类似的uint8_t).这将允许您正确地比较其他矩阵值.但这假设你总是处理积极的价值观.

如果矩阵也必须存储负数,那么我担心你的数据类型太小并且无法保存该值178.

否则,最简单的选择是在比较之前将类型转换为unsigned:

if (static_cast<unsigned char>(matrix[x][y]) != 178)
Run Code Online (Sandbox Code Playgroud)

  • `char`的签名是实现定义的,虽然签名很常见.对于数值,选择`signed char`或`unsigned char`比使用普通`char`要好得多. (3认同)