Affectation d'une variable lors de la déclaration

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 951 fois - Téléchargée 195 fois

Contenu du snippet

J'ai vu certains codes où les programmeurs veulent affecter une valeur à plusieurs variables en une seule ligne. L'affectation n'est pas correcte.

Source / Exemple :


Je m explique...

J ai vu, par exemple, au démarrage d un programme : A = B = C = 1
Où A, B et C sont trois variables numériques (Integer, Long, etc...).

La personne veut donc affecter la valeur 1 aux variables A, B et C.
Mais en résultat toutes les variables seront égales à 0. Pourquoi ?

Pour commencer, il faut savoir que toutes les variables numériques
sont par défaut égales à 0 au début d un programme.

La ligne A = B = C = 1 n affecte une valeur qu a la variable A, non
pas à B, ni à C.
Car quand vous voulez affecter une valeur à une variable, TOUTE
EXPRESSION QUI SUIT LE PREMIER SIGNE "=" sera le calcul de la valeur.
Donc :

A = B = C = 1   nous donne   A = Expression( B = C = 1 )

L expression B = C = 1 est en fait une vérification, ou une
comparaison.
En plus clair, ça donnerait (parce qu une opération se fait
généralement de gauche à droite avec les mêmes opérateurs) :

( B = C ) = 1

Ce qu il faut aussi savoir, c est que les valeurs booléennes
(Boolean) VRAI et FAUX (TRUE et FALSE), utilisées dans les
comparaisons, peuvent aussi avoir une valeur numérique qui sont
-1 pour TRUE, et 0 pour FALSE.

On fait la vérification... Au démarrage du programme, A, B et C sont
égaux à 0 comme je l ai dit au début.

B = C ?  -->  0 = 0 ?  -->  TRUE

Donc on enlève "( B = C )" de l expression.

( B = C ) = 1  -->  ( TRUE ) = 1

Etant donné que la prochaine comparaison se fait entre une valeur
booléenne et un chiffre, la valeur TRUE est convertie en chiffre,
donc -1

-1 = 1 ?  -->  FALSE

FALSE est le résultat de l expression. On peut maintenant revenir à
la ligne complète :

A = B = C = 1  -->  A = ( B = C ) = 1  -->  A = ( 0 = 0 ) = 1
A = TRUE = 1  -->  A = ( TRUE = 1 )  -->  A = ( -1 = 1 )
A = FALSE  -->  A = 0

On affecte donc la valeur 0 à A, et les variables B et C ne changent
pas. Voilà.

Conclusion :


Je sais pas si j'ai été clair pour ceux qui ne connaiss(ai)ent pas ça. Dans le cas contraire, postez vos questions.

A voir également

Ajouter un commentaire

Commentaires

Proger
Messages postés
248
Date d'inscription
vendredi 10 novembre 2000
Statut
Membre
Dernière intervention
19 décembre 2008
-
A = B = C = 1
mais aussi A = B > C
ou encore A = B > C And D < C
bref, tout cela sert a plaçer dans une variable le résultats d'opérations booléenne, qui sont des opérations mathématique aussi importante en prog que les additions et soustraction.
Cela devient interessant de faire un
A B C
do
...
if a then
...
loop

qui sera plus rapide que
do
...
if B = C then
...
loop

mauvais exemple, mais l'idée est là.
Jujufouq
Messages postés
254
Date d'inscription
jeudi 27 décembre 2001
Statut
Membre
Dernière intervention
5 mars 2006
-
Là, par contre, c'est une source intéressante.
cs_ABF
Messages postés
228
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
26 avril 2012
-
SAlut, comment peut t'on définir un tableau d'entier

par défaut il est initialisé à 0, comment lui dire de s'initialiser à 3 ?
le tableau vide (20,5) : toutes les "cases" seront à 0 mais si on souhaites les déclarer à 3 est t'on obliger defaire une boucle et de tout mettre à 3 ? (très long pour un gros tableau !!)

Merci

++
Proger
Messages postés
248
Date d'inscription
vendredi 10 novembre 2000
Statut
Membre
Dernière intervention
19 décembre 2008
-
Oui, la grosse boucle est la seule "bonne" solution. Quand ton programme est compilé, c'est rapide. Surtout si tu n'as qu'une dimension.

Cependant tu peux aussi utiliser l'API RtlFillMemory si vraiment la boucle te dérange (ou que tu as plusieurs dimensions à ton tableau), mais ca rempli tous les octets (byte) sans distinction integer ou long.

Une dernière astuce si ton tableau est vraiment de grande taille, tu crées une ligne avec des 3, et tu utilises l'API RtlCopyMemory pour le copier à chaque "colonne"...
Cependant j'insiste qu'une fois compilé, c'est la boucle "mano" qui sera le plus rapide.
cs_ABF
Messages postés
228
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
26 avril 2012
-
SAlut et Merci Proger

C'est méthode "mano" que j'ai employée !

++
Commenter la réponse de msohet

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.