Plusieurs conditions dans un C "pour" boucle
Je suis tombé sur ce morceau de code. Je l'utilise généralement "&& " ou "| | " pour séparer plusieurs conditions dans un for
boucle, mais ce code utilise des virgules pour le faire.
Étonnamment, si je change l'ordre des conditions de la sortie varie.
#include<stdio.h>
int main() {
int i, j=2;
for(i=0; j>=0,i<=5; i++)
{
printf("%d ", i+j);
j--;
}
return 0;
}
De sortie = 2 2 2 2 2 2
#include<stdio.h>
int main(){
int i, j=2;
for(i=0; i<=5,j>=0; i++)
{
printf("%d ", i+j);
j--;
}
return 0;
}
De sortie = 2 2 2
Quelqu'un peut-il expliquer la raison? Il semble être de ne cocher que la dernière séparées par des virgules condition.
- Mauvais code. Vous avez raison, plusieurs conditions doivent être réunis avec des && et ||.
- Cinq réponses, tout le monde en prenant la question trop littéralement et en expliquant ce qu'une virgule, et pas une seule réponse, ce qui suggère que c'est terriblement cassé.
Vous devez vous connecter pour publier un commentaire.
L'opérateur virgule évalue tous ses opérandes et les rendements de la valeur de la dernière. Donc, fondamentalement, selon la condition de vous écrire d'abord, il sera ignorée, et la deuxième on va être important que.
est donc équivalent à
qui peut ou peut ne pas être ce que l'auteur du code destiné, selon ses intentions - j'espère que ce n'est pas le code de production, parce que si le programmeur qui a écrit ce voulu exprimer une relation entre les conditions, alors c'est incorrect et le
&&
, l'exploitant doit avoir été utilisé à la place.j>=0
, est évalué mais le résultat n'est jamais utilisé. La boucle continue tant que je ne dépasse pas 5, même si j est inférieur à 0. regarde comme la boucle va s'arrêter à j = -1, mais il ne sera pas. Difficile de dire que rien d'autre que de cassé.j>=0
peut jamais être évalué, parce que le compilateur est susceptible d'avis que sa valeur n'est jamais utilisé, et il n'a pas d'effets secondaires, donc il peut les jeter comme des morts de code...Bien sûr, c'est juste ce que vous dites au début, et C opérateur logique
&&
et||
sont ce que vous utilisez habituellement pour "connecter" les conditions (expressions que peut être évaluée comme true ou false); l'opérateur virgule n'est pas un opérateur logique et son utilisation dans cet exemple n'a aucun sens, comme expliqué par d'autres utilisateurs. Vous pouvez l'utiliser, par exemple, "concaténer" des déclarations dans les pour lui-même: vous pouvez initialiser et mettre à jour j tout à fait avec moi, ou de l'utilisation de l'opérateur virgule en d'autres les moyensLa virgule expression prend la valeur de la dernier (eg. la plus à droite) de l'expression.
Donc, dans votre première boucle, la seule qui contrôle l'expression est
i<=5
; etj>=0
est ignoré.Dans la deuxième boucle,
j>=0
contrôles de la boucle, eti<=5
est ignoré.Comme pour un raison... il n'y a pas de raison. Ce code est juste mal. La première partie de la virgule-expressions ne rien à l'exception de confondre les programmeurs. Si un grave programmeur a écrit cela, ils devraient avoir honte d'eux-mêmes et ont leur clavier révoquée.
De ne pas utiliser ce code; celui qui a écrit, il a clairement une incompréhension fondamentale de la langue et n'est pas digne de confiance. L'expression:
évalue "j >= 0", puis la jette loin et ne fait rien avec elle. Ensuite, elle évalue "i <= 5" et utilise cela, et seulement cela, en tant que condition pour la fin de la boucle. L'opérateur virgule peut être utilisés de manière significative dans une condition de boucle lorsque l'opérande de gauche a des effets secondaires; vous verrez souvent des choses comme:
dans lequel la virgule est utilisée pour se faufiler dans d'initialisation supplémentaires et l'incrément de déclarations. Mais le code affiché est de ne pas le faire, ou quoi que ce soit d'autre significatif.
Wikipédia raconte ce qu'opérateur virgule n':
"Dans le C et le C++ langages de programmation, l'opérateur virgule (représenté par le jeton
,
) est un opérateur binaire qui prend la valeur de son premier opérande et ignore le résultat, puis évalue le deuxième opérande et retourne cette valeur (et le type)."Il est un opérateur en C appelé l'opérateur virgule. Il exécute chaque expression dans l'ordre et renvoie la valeur de la dernière instruction. C'est aussi un point de séquence, ce qui signifie que chaque expression est garantie à exécuter complètement et dans l'ordre avant l'expression suivante dans la série exécute, semblable à
&&
ou||
.Remplissant M. Crocker réponse, être prudent quant à l' ++ ou -- les opérateurs ou je ne sais pas peut-être d'autres opérateurs.
Ils peuvent affecter la boucle. par exemple, j'ai vu un code similaire à celui-ci dans un cours:
Le résultat serait de 1 $ 2$. Donc, la première déclaration a affecté la boucle tant que le résultat de la suite est beaucoup de zéros.