代码覆盖数组

时间:2013-04-20 01:19:02

标签: c

这些代码示例是否有问题?如果现场有一个X,如果可以获胜,它仍会覆盖现场的O.显然if not声明不起作用? 88和79是ASCII中的'X'和'O'。

while(i+j<6)
    {
        if (board[i][j]+board[i][j+1] == compXO*2)
        {
            if(board[i][j+2] != (88||79)) 
            {
            board[i][j+2] = compXO;
            won=1;
            break;
            }
        }
        else 
            i++;
    }


if (board[i+1][j+1]+board[i+2][j+2] == compXO*2)
    {   
        if(board[i][j] != (88||79)) 
        {
        board[i][j] = compXO;
        won=1;

        }
    }

4 个答案:

答案 0 :(得分:2)

您不能同时比较两个不同的值,因为表达式88||79是逻辑的,并且评估为1,适当的方式是:

if(!(board[i][j] == 88 || board[i][j] == 79)) 

if(board[i][j] != 88 && board[i][j] != 79)

答案 1 :(得分:1)

if声明没有按照您的想法执行:

if(board[i][j+2] != (88||79)) 

应该是:

if (board[i][j+2] != 88 && board[i][j+2] != 79) 

88||79正在执行逻辑或值为7988的值true,它始终为1,等于1,所以你是每次将电路板元素与{{1}}进行比较。

答案 2 :(得分:1)

88||79相当于1.因此,您的if (board[i][j+2] != (88||79))实际上等同于if (board[i][j+2] != 1)

你可能想要的是:

if (board[i][j+2] != 88 && board[i][j+2] != 79))

答案 3 :(得分:1)

表达式

if (board[i][j+2] != (88||79)) 

board[i][j+2]与1进行比较,因为(88 || 79)的计算结果为真,即1。

也许你所追求的是:

if (board[i][j+2] != 88 && board[i][j+2] != 79)

如果你给那些非显而易见的数字命名(或使用'X''O',那会更好 - 使用字符表示法绝对没有效率增益(或损失),但是清晰度有很大的提升。

if (board[i][j+2] != 'X' && board[i][j+2] != 'O')

如果你有一个用来表示'既不是X也不存在'的字符,可能是' '或其他值(0?),那么你可以将测试简化为:

#define EMPTY ' '

if (board[i][j+2] == EMPTY)

这似乎是你正在测试的。如果您不确定您的电路板是否准确,您应该编写一个验证函数,检查每个方格是否具有有效值('X''O'EMPTY)并且没有太多'X''O' s。在您担心它可能已经改变或无效的任何时候调用它。