2011-02-27 5 views
0
if(location[0] <= 'H' || location[0] >= 'A' 
&& location[1] <= 8 || location[1] >= 1) 

Je vérifie pour voir si le premier est entre indice 'A' et 'H' et le second est compris entre 1 indice - 8.Quel est le problème avec ma logique?

donc l'argument = 1 si l'utilisateur est entré {A, 1} -1 si l'utilisateur est entré {J, 1}

+0

Je suppose que ce que je suis vraiment après, est combien d'arguments peuvent être mis à l'intérieur d'une déclaration conditionnelle? – bluetickk

+1

Pour référence future: http://www.cppreference.com/wiki/language/operator_precedence – Muggen

Répondre

0

Désolé les gars, nouveau ici. J'aurais dû poster toute ma méthode. Merci d'expliquer la préséance des opérateurs, mais mon problème était que je comparais un char avec un int. Tout ce que je devais faire était de mettre «autour de mes chiffres.

void GameBoard::enterShips() 
{ 
    char location[2]; 
    int ships = 0; 
    int count = 1; 

    while(ships < NUM_SHIPS) 
    { 
     cout << "Enter a location for Ship " << count << ": "; 
     cin >> location[0]; 
     cin >> location[1]; 
     cout << endl; 

     if((location[0] <= 'H' && location[0] >= 'A') && (location[1] <= '8' && location[1] >= '1')) 
     { 
      location[0] = location[0] - 64; 
      location[1]--; 
      Grid[location[0]][location[1]] = SHIP; 
      ships++; 
      count++; 
     } 
     else 
     { 
      cout << "Wrong coordinates entered. Try again." << endl << endl; 
     } 
    } 
} 
+0

http://www.asciitable.com/. Vous pourriez trouver cela intéressant dans le futur. – Muggen

2

et (&&) a priorité supérieure ou (||), afin d'exprimer ce que vous voulez vous avez besoin:

if ((location[0] <= 'H' || location[0] >= 'A') && (location[1] <= 8 || location[1] >= 1)) 

Sinon ce qui se passe est-ce que c'est ça fait l'équivalent de ceci:

if (location[0] <= 'H' || (location[0] >= 'A' && location[1] <= 8) || location[1] >= 1) 

Ce qui n'est clairement pas ce que vous vouliez.

Vous pouvez mettre autant d'expressions dans la condition que vous le souhaitez, mais vous devez vous rappeler les règles de priorité; Je suggère toujours d'utiliser des parenthèses supplémentaires pour plus de clarté. Comme Jeremiah l'a souligné dans les commentaires, la condition ne ferait toujours pas ce que vous vouliez - vous demandez si quelque chose est dans une plage donnée en vérifiant si c'est soit moins que la limite supérieure ou supérieure que la borne inférieure (ce qui couvre toutes les entrées), lorsque vous avez l'intention de vérifier si l'entrée était à la fois plus grand que la limite inférieure et inférieure à la supérieure:

if (location[0] <= 'H' && location[0] >= 'A' && location[1] <= 8 && location[1] >= 1) 

Dans ce cas, étant donné que les opérateurs sont tous &&, aucune parenthèse supplémentaire n'est nécessaire, mais vous pouvez les ajouter pour plus de clarté.

+3

Et les opérateurs '||' doivent être '&& 'de toute façon; actuellement, le test passera toujours. –

+0

Merci pour la réponse rapide, mais il ne fonctionne toujours pas. Tout emplacement en dehors des limites renvoie toujours vrai – bluetickk

+0

@bluetickk, car supposons que 'location [0]' est '' L'', c'est'> 'que 'A', ce qui évalue' true'. Vous avez besoin de '&&'. – Muggen

0

parenthèse Ajouter au groupe les conditions:

if((location[0] <= 'H' || location[0] >= 'A') && (location[1] <= 8 || location[1] >= 1)) 
1

Vous devez && est pas || s. Par exemple: 'Z' >= 'A' || 'Z' <= 'H' est vrai.

if(location[0] <= 'H' && location[0] >= 'A' && location[1] <= 8 && location[1] >= 1) 

Bien que pas nécessaire dans ce cas, il convient de regrouper la logique avec les parenthèses (et si elles étaient || s vous devez pour que cela fonctionne comme prévu):

if((location[0] <= 'H' && location[0] >= 'A') && (location[1] <= 8 && location[1] >= 1)) 
0

Si l'emplacement [0] était égal à 'J' (certainement pas entre 'A' et 'H'), votre if-clause serait VRAI car même si l'emplacement [0] < = 'H' est FAUX, emplacement [0]> = 'A' est VRAI et vous utilisez || (OU). Le problème est que vous utilisez || (OR) au lieu de & & (AND). Vous devez utiliser tous les & & (AND) dans la clause if.

+0

if ((emplacement [0] <= 'H' && emplacement [0]> = 'A') && (emplacement [1] <= 8 && emplacement [1]> = 1)) - {A, 1} renvoie faux? – bluetickk

+0

if ((emplacement [0] <= 'H' && emplacement [0]> = 'A') && (emplacement [1] <= 8 && emplacement [1]> = 1)) - {A, 1} renvoie true car chaque clause individuelle est vraie. –

0

&& est plus prioritaire que ||. , Vous voudrez peut-être ainsi écrire comme

if((location[0] <= 'H' || location[0] >= 'A') && (location[1] <= 8 || location[1] >= 1)) 

Si vous avez déjà essayé cela, s'il vous plaît dire quelle erreur vous avez

-1

Comme vous pouvez le voir dans this operator precedence table, && est classé n ° 13. C'est plus élevé que ||, ce qui est # 14.


Par conséquent:

if(location[0] <= 'H' || location[0] >= 'A' 
&& location[1] <= 8 || location[1] >= 1) 

équivaut à:

if(location[0] <= 'H' || (location[0] >= 'A' 
&& location[1] <= 8) || location[1] >= 1) 

Vous voulez:

if((location[0] <= 'H' || location[0] >= 'A') && 
    (location[1] <= 8 || location[1] >= 1)) 

Ou encore mieux:

if(((location[0] <= 'H') || (location[0] >= 'A')) && 
    ((location[1] <= 8) || (location[1] >= 1))) 

je mets toujours des crochets autour de tout sauf lorsque */ et +- sont concernés. Même si vous mémorisez la table, vous ne devriez pas supposer que les autres le font.

Il contribue à la lisibilité du code et aide à prévenir les bogues ... même les bogues du compilateur! Triple bonus. :)

EDIT: Ah, vous voulez que tout soit vrai. Il suffit d'utiliser tous&& s, alors! Cela fonctionne:

if(((location[0] <= 'H') && (location[0] >= 'A')) && 
    ((location[1] <= 8) && (location[1] >= 1))) 
+0

C'est toujours faux. si 'location [0]' est 'L', cela sera évalué à 'true' – Muggen

+0

@Muggen Fixed. :) –

Questions connexes