-7
votes

Cette utilisation de si les déclarations causent-elles un comportement indéfini?

J'aimerais connaître la bonne utilisation des conditionnels tels que si des déclarations pour éviter les comportements non définis. Commençons par un exemple:

uint8_t x = 0;
bool y = false;
bool z = false;

if ((x == 135) and !y and !z) {
    //do something
}
else if ((x == 135) and y) {
    x = 5;
    z = true;   
}
else if ((x == 5) and z) {
    x = 135;
    z = false;
}
else {
    //do something
}


18 commentaires

Vous n'êtes pas obligé d'inclure aucune des variables dans vos conditions.


Bienvenue dans le débordement de la pile! On dirait que vous pouvez utiliser un Good C ++ Book


@NeilButterworth, je comprends que, mais pour le bien de la démonstration que j'ai. Quel est le problème avec mon "flux"?


Ce ne serait pas un comportement indéfini. Ce serait un bogue dans votre code. Ce que nous ne pouvons pas déboguer puisque nous ne savons pas ce que vous voulez que le code fasse.


Il n'y a pas de comportement indéfini.


@Nathanoliver, j'ai eu l'amorce C ++ :)


"Est-ce que je vais avoir un comportement indéfini" Vous pourriez avoir une impression que vous pouvez obtenir UB de l'air mince en C ++, mais ce n'est pas que mauvais. : p


"Comportement indéfini" est un terme spécifique en C ++ où vous faites quelque chose qui est explicitement appelé dans la norme comme un gros "ne fais pas ça". Ce que vous décrivez, c'est plus dans le sens d'une surveillance commune du code, que, comme d'autres, vous aurez dit, vous trouverez lors du débogage.


Il pense que cela aiderait à rendre la question plus claire si vous essayez de plus expliquer pourquoi vous pensez qu'il y a quelque chose qui ne va pas avec votre code. Il n'y a rien de évidence faux, donc ce n'est pas si facile à répondre


Comment avez-vous eu l'idée que votre code a quelque chose à faire avec un comportement indéfini?


@Dmytrodadadyka Ce sonne Borderline inconstructive, imo. Peut-être devriez-vous expliquer pourquoi vous pensez exactement que cela ne "porte aucune valeur"?


@ Hypomania à propos de votre déclaration (que j'ai roulée) Un total de 6 personnes a baissé votre question. Il semble un peu dur pour juger une communauté d'environ 9 000 000 personnes en fonction de cela.


Des questions comme celle-ci attirent beaucoup d'attention négative car elles montrent un manque de compréhension des fondamentaux. Le comportement non défini en C ++ est une chose spécifique, pas un miasma qui l'envahit là où elle peut apparaître sans avertissement. La déclaration si n'est pas une source de grand mystère, ni des valeurs booléennes ou entières fonctionnent dans des expressions logiques. Un exemple de comportement non défini consiste à accéder à un pointeur après avoir été libéré ou accédant à un élément en dehors des limites de la matrice, en d'autres termes, des choses que vous ne devriez pas faire en premier lieu.


Il n'y a absolument rien de mal à apprendre ou à avoir un malentendu des fondamentaux, à prévoir lors de la prise en charge d'un nouveau langage de programmation. Le problème est lorsque vous demandez un débordement de pile Nous ne pouvons pas vraiment vous expliquer tout cela, il y a Livres entiers écrits sur C ++ qui font le travail beaucoup mieux, le meilleur plan ici est donc d'obtenir une poignée à ce début, et ensuite vos questions seront mieux reçues parce que nous pouvons réellement aider et donner une technique répondre au-delà "non".


Si vous souhaitez explorer un comportement non défini, modifiez les premières lignes à uint8_t x; bool y; bool z; . L'utilisation de variables non définies est un comportement indéfini.


@tadman Je ne me suis probablement pas exprimé comme je le voulais, je ne voulais pas dire un comportement indéfini dans un sens que c ++ le décrit, je voulais dire au hasard, mais je ne le ferai jamais, je vais que cela soit ma leçon.


Si vous êtes un peu wobbly sur logique booléenne , qui n'a rien à avoir honte de comme il Peut être subtilement délicat, je suggérerais une amorce à ce sujet aussi. Cela aidera à comprendre comment les expressions logiques peuvent être réécrites ou retravaillées et préserver toujours le même comportement.


@tadman, merci, vraiment apprécié!


3 Réponses :


5
votes

vais-je obtenir un comportement indéfini en n'incluant pas les 3 variables dans chaque état?

Le comportement de ne pas inclure toutes les variables dans chaque condition n'est pas indéfini par lui-même.

tous les non comptabilisés pour la condition vont-ils entrer dans la déclaration d'autre?

Déclaration-false (c'est-à-dire la déclaration après le mot-clé sinon ) est exécuté si la condition est fausse.

Que se passe-t-il si je me débarrasse de la déclaration d'autre?

L'exécution continue de la déclaration après la déclaration IF.


1 commentaires

Merci d'être patient et de m'expliquer pour moi (contrairement à d'autres personnes).



0
votes

Non, vous n'avez pas de comportement indéfini ici. On dirait que vous n'avez que vous n'avez pas de modèle mental précis de logique conditionnelle (booléenne). sinon est toujours une partie facultative d'un si instruction.

exactement un du {...} Les blocs seront exécutés. Modification des valeurs de x , y ou z à l'intérieur de tout d'entre eux ne fera que l'exécution d'autres, la décision est faite Premier .


0 commentaires

2
votes

En règle générale Oui, c'est une mauvaise idée de tenter de lire une variable qui n'a pas été initialisée aussi souvent que le comportement est indéfini . Mais ce n'est pas le cas ici: toutes vos variables sont initialisées.

Mais tout ce dont vous avez besoin dans un si (...) La condition est quelque chose qui évalue à true ou false . Sur ce point, votre code est absolument bien. J'utiliserais && et || plutôt que et et ou car les anciens sont plus courants. < / p>

Pour un ensemble assez complet de constructions non défini, voir Quels sont tous les comportements indéfinis communs qu'un programmeur C ++ devrait savoir?


1 commentaires

Merci pour votre réponse, vraiment apprécié.