Как исправить предложенные скобки вокруг сравнения в операнде '==' - PullRequest
0 голосов
/ 08 мая 2019

У меня есть код вроде

if (config_atual[6]==config_atual[7]==config_atual[8] || 
    config_atual[1]==config_atual[4]==config_atual[7] || 
    config_atual[2]==config_atual[4]==config_atual[6])
{
   if (config_atual[7]=='X')
       cout << "O Jogador ganhou!" << endl;
   else if (config_atual[7]=='O')
       cout << "O Computador ganhou!" << endl;
}

об игре в крестики-нолики, и всякий раз, когда я пытаюсь скомпилировать эту строку кода, которая проверяет три условия выигрыша (предполагая индексы 0,1,2 для первой строки, 3,4,5 для второй и 6,7,8 за последнее) Я получаю это предупреждение:

suggest parentheses around comparison in operand of '==' [-Wparentheses]

Что я не понимаю. Что я делаю неправильно, config_atual - это массив символов, который содержит текущую конфигурацию игрового поля.

Что означает это предупреждение и как я могу его исправить?

Ответы [ 4 ]

3 голосов
/ 08 мая 2019

Выражение config_atual[6]==config_atual[7]==config_atual[8] равно , сгруппировано как (config_atual[6]==config_atual[7])==config_atual[8].Часть в скобках - либо true, либо false, которая неявно преобразуется в тип int (или тип config_atual[8] шире, чем int) перед повторным сравнением;то есть config_atual[8]=={1, 0}, где я использовал то, что в {}, чтобы указать возможности.То, что вероятно заканчивается как false.

Иногда цепочка == таким способом полезна.Но в вашем случае это не так, и вам нужно написать выражение по-другому;

config_atual[6]==config_atual[7] && config_atual[7]==config_atual[8]

является одним из таких способов.

3 голосов
/ 08 мая 2019

== оператор в C ++ не работает так.Он допускает только два операнда, что означает, что конструкции типа a == b == c не будут работать так, как вы ожидаете.Вместо этого перепишите условие в форме (a == b && b == c) (и помните о скобках).

1 голос
/ 08 мая 2019

Вы можете сделать это так

if ((config_atual[6]==config_atual[7] && config_atual[7]==config_atual[8]) ||
    (config_atual[1]==config_atual[4] && config_atual[4]==config_atual[7]) ||
    (config_atual[2]==config_atual[4] && config_atual[4]==config_atual[6]))
0 голосов
/ 09 мая 2019
if (((config_atual[6]==config_atual[7])==config_atual[8]) || 
    ((config_atual[1]==config_atual[4])==config_atual[7]) || 
    ((config_atual[2]==config_atual[4])==config_atual[6]))
{
   if (config_atual[7]=='X')
       cout << "O Jogador ganhou!" << endl;
   else if (config_atual[7]=='O')
       cout << "O Computador ganhou!" << endl;
}
...