2010-11-26 20 views
10

Je viens de découvrir ce « C++ » aujourd'hui et je ne peux pas lui donner un sens:si sans condition?

if(array[i][j]) {--i;--j;}

quelqu'un peut-il me explique comment ce travail? Je ne comprends pas. Quelle est la condition ici? Il semble que ce serait vrai à chaque fois, mais quand je me suis débarrassé de l'IF (donc seulement ce {--i;--j;} à gauche.) Cela ne fonctionne pas de la même manière.

Je suis tout à fait nouveau pour C++ nous vous recommandons donc avec les explications! :)

Merci!

+8

C'est donc vous qui avez introduit la tendance pour 'if (val! = 0) {...}'! – ruslik

+1

Sur une note connexe, il est parfaitement valide de dire 'boolean b = whatever(); if (b) {...} else {...} ', car' if' ne s'attend pas à une * condition *, mais plutôt à une * expression booléenne *, et l'une des expressions booléennes les plus simples est le nom d'un booléen variable. – fredoverflow

Répondre

10

tableau en supposant est un tableau de int (ou d'autres types intégraux) la condition sera fausse si et seulement si array[i][j] == 0

20

En C++, une valeur non nulle peut être utilisé pour indiquer le « succès » dans une condition déclaration.

Ceci est de C99, section 6.8.4.1:

La if Déclaration

2 Dans les deux formes, la première sous-structure est exécutée si l'expression compare pas égal à 0.

De C++ 03, section 6.4

4 La valeur d'un con dition qui est une déclaration initialisée dans une instruction autre qu'une instruction switch est la valeur de la variable déclarée implicitement convertie en type bool. Si cette conversion est mal formée, le programme est mal formé. La valeur d'une condition qui est une déclaration initialisée dans une instruction switch est la valeur de la variable déclarée si elle a un type entier ou énumération, ou de cette variable implicitement convertie en type entier ou énumération autrement. La valeur d'une condition qui est une expression est la valeur de l'expression, implicitement convertie en bool pour des instructions autres que switch; si cette conversion est mal formée, le programme est mal formé. La valeur de la condition sera simplement appelée «la condition» lorsque l'usage est sans ambiguïté.

et la conversion booléen est défini dans 6.3.1.2

6.3.1.2 type booléen

1 Lorsqu'une valeur scalaire est converti en _Bool, le résultat est égal à 0 si la valeur se compare égal à 0; sinon, le résultat est 1.

Et int est un type scalaire. Je suppose que c'est ce que votre tableau est rempli comme vous pouvez utiliser unaire ++ et -- sur eux.

3

Le if est obtient un true si array[i][j] obtient true quand il est lancé à un bool. Si array a par ex. float ou int valeurs, quoi que ce soit pas égal à 0 seront jetés à true. La situation pourrait être différente pour les types définis par l'utilisateur.

0

L'instruction if requiert une valeur booléenne entre parenthèses. Donc, il va essayer de lancer explicitement tout ce que votre expression est dans un booléen. Pour les entiers et les pointeurs, par exemple, une valeur non nulle sera vraie et une valeur nulle sera fausse. Par conséquent, si votre expression (tableau [i] [j]) peut être convertie en vrai, la condition sera vraie.

+0

Je pense que vous vouliez dire "Donc, il va essayer de _implicitement_ jeter ce que votre expression est dans un booléen" – Praetorian

+0

Vous avez absolument raison prétorienne. Désolé pour cette faute de frappe. – Cthutu

0

la "condition" est une expression bool. En C++, int peut être implicitement converti en bool. (où 0 = faux, et tout le reste est vrai).

+0

0 = false, toutes les autres valeurs = true (pas seulement 1). – Marcin

+0

ack! Je vous remercie; mis à jour ma réponse. Je pensais à l'inverse (lancer à partir de bool -> int signifie vrai = 1). – tenfour

0

Il serait préférable pour vous de comprendre si je réécris votre code de la façon suivante:

if((array[i][j])==true) 
{ 
    --i; 
    --j; 
} 

Cela signifie donc que, la condition if vérifie effectivement si votre ligne de tableau et la valeur de la colonne est booléen true. Puis il ira à l'intérieur de votre if-block et décrémentera la valeur i et j, cela signifie qu'il passera à la ligne précédente et à la colonne précédente de votre tableau.

Bien sûr, vous devez convertir le type de données de votre tableau en booléen avant de l'implémenter.