Amusent nous à incrémenter, décrémenter quand penser vous ?

Résolu/Fermé
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - Modifié par sambia39 le 30/01/2014 à 16:05
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 15 févr. 2014 à 20:43
Bonjour
le choix d'incrémentation peut fausser des résultat d'une opération intermédiaire ?.
exemple:

#include <cstdio>
#include <iostream>

int main(void){

 int i=0;

 /* (-_-) */
 std::cout<<" (I++ & ++I) & (I-- & --I)"<<std::endl;
 std::cout<<"Valeur I++\t:"<<i++<<std::endl; /* affiche 0 */ 
 std::cout<<"Valeur I++\t:"<<i++<<std::endl; /* affiche 1 */
 std::cout<<"Valeur ++I\t:"<<++i<<std::endl; /* affiche 3 */
 std::cout<<"Valeur ++I\t:"<<++i<<std::endl; /* affiche 4 */
 std::cout<<"Valeur I++\t:"<<i++<<std::endl; /* affiche 4 */
 std::cout<<"Valeur ++I\t:"<<i--<<std::endl;    /* affiche 5 */
 std::cout<<"Valeur I--\t:"<<--i<<std::endl;      /* affiche 3 */
 std::cout<<"Valeur --I\t:"<<i++<<std::endl;    /* affiche 3 */
 
 std::cout<<"Valeur I\t:"<<i<<std::endl;           /* affiche  4*/
 std::getchar();
 return 0;
}


des avis ??

3 réponses

armasousou Messages postés 1267 Date d'inscription dimanche 16 août 2009 Statut Membre Dernière intervention 30 décembre 2016 83
9 févr. 2014 à 18:15
Ca a toujours été (enfin depuis l'invention du C), rien de choquant ...

avec "i++" on utilise la valeur d'i PUIS on l'incremente, avec "++i", on incremente i PUIS on utilise la (nouvelle) valeur d'i.
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
10 févr. 2014 à 01:16
Bonsoir,
Merci de votre réponse, mais vous ne m'appreniez rien, et ça ne répond pas du tout à ma question, ma question est : "est-il possible à une incrémentation de fausser un calcul intermédiaire pendant l'opération d'incrémentation (préfixé et suffixé) c'est pour cela que j'ai mis cet exemple et plus précisément pour montré qu'il y a une subtilité entre les valeurs de retour des incrémentations selon leur formes
i++; /* i=(i+1) donc valeur avant incrémentation */
++i; /* i=(1+i) donc valeur après incrémentation */

autres exemple
a=i++; /* donc a=i puis a=i+1; */
a=++i; /* donc a=1+i; puis a=i;*/

Et me demander si cette subtilité minime peut erroné un calcul entre 2 incrémentations
0
Bonjour

Je ne suis pas sûr (un spécialiste pour confirmer ?) que l'ordre d'évaluation des opérantes soit spécifié dans le langage.
Dans ce cas, si on utilise plusieurs fois une variable pré ou post incrémentée dans une même expression, le résultat peut être indéterminé :

i
nt i=5;
std::cout<<(i++) / (i++)<<std::endl;


Si le diviseur est évalué avant le dividende, on va calculer 5/6 et afficher 0 ; si le dividende est évalué avant le diviseur, on va calculer 6/5 et afficher 1.

Mais faut être tordu pour jouer à ça...
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
10 févr. 2014 à 17:43
Justement je suis assez tordus pour essayer cela, mais en réalité cela dépend de la priorité de l'opérateur, mais également la priorité entre les opérateurs et le sens d'évaluation des opérateurs, qui ce fait de la gauche vers la droite sauf cas des priorités des opérateurs 3(préfixe), 15(conditionnel ternaire ? :) et 16(opérateur d'affectation = *= /= %= etc.) qui sont de la droite vers la gauche en d'autres termes, c'est le sens d'utilisation des opérateurs qui influe sur le résultat exemple
ainsi si on écris
int x=10+3*8;

et que si c'est l'addition qui est prioritaire alors en auras 13*8 = 104 mais si c'est le contraire ont obtiendrais 10+24=34, alors oui le résultat demandé peut-être fausser et c'est rigolo imaginant si un tordu comme moi joue avec des actionneurs sur l'option des puissances, exemple pour réguler une pression ou température à titre exemple en peut très bien varier le style d'incrementation ou décrémentation et ainsi déboussoler l'équipement mais loin de moi cette idée c'est un exemple lol
0
Utilisateur anonyme
11 févr. 2014 à 09:54
Les priorités d'évaluation des opérateurs sont un autre problème. Ils suivent des règles parfaitement déterminées par le langage, il n'y a aucune incertitude là-dessus. Ton histoire de 10+3*8 ne peut tromper que les grands débutants en C.
Il ne faut pas confondre les indéterminations vraiment dues au langage avec celles dues à l'ignorance du programmeur.

L'ordre d'évaluation des opérandes n'est pas spécifié dans le langage, du moins pas dans le C de base défini par Ritchie . Regarde le paragraphe 7 :
http://cm.bell-labs.com/who/dmr/cman.pdf. Donc le résultat de l'exemple que je donnais n'est pas prévisible et ce n'est pas une question d'ignorance du programmeur, contrairement à ton 10+3*8.

Tu peux toujours essayer (i++) / (i++) dans un programme par curiosité, mais tu n'as aucune garantie que la même ligne recopiée ailleurs dans ton programme donnera le même résultat. Celui qui écrit ce genre d'expression autrement que "pour voir" n'est pas un tordu ni un rigolo, c'est un incompétent.
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
12 févr. 2014 à 23:34
Bonsoir

@le père Ton histoire de 10+3*8 ne peut tromper que les grands débutants en C.
L'exemple démontre juste l'ordre prioritaire des opérateurs qui peut donner des résultats no souhaités. À aucun moment j'ai parlé de calcul indéterminer, mais plutôt résultat erroné d'une opération entre deux incrémentations.

@le père Si le diviseur est évalué avant le dividende, on va calculer 5/6 et afficher 0 ; si le dividende est évalué avant le diviseur, on va calculer 6/5 et afficher 1.
Ton exemple revient sur l'ordre d'évaluation qui se fait soit de la gauche vers la droite ou de la droite vers la gauche ce qui résume un peu mon exemple de l'ordre des évaluations des opérateurs
x=10+3*8; x=34 ou x=104

Rappel@sambia39 cela dépend de la priorité de l'opérateur, mais également la priorité entre les opérateurs et le sens d'évaluation des opérateurs

@le père Tu peux toujours essayer (i++) / (i++) dans un programme par curiosité, mais tu n'as aucune garantie que la même ligne recopiée ailleurs dans ton programme donnera le même résultat
En effet ça donne pas le même résultat à cause de plusieurs facteurs cas de ton exemple l'ordre dévaluation ou sens d'évaluation de l'opérateur

@le père genre d'expression autrement que "pour voir" n'est pas un tordu ni un rigolo, c'est un incompétent.
vouloir comprendre les choses et savoir comment ça marche, ne fais pas de nous des incompétents, mais des curieux recherchant la compréhension des choses, et savoir comment ça marche (: D) (d'ailleurs le sens du mot curiosité veut dire envie de voir, d'apprendre de nouvelles choses).
celui qui ni la curiosité est dans l'incompétence totale de découvrir et comprendre certaines choses, d'ailleurs la science après tout, qu'est-elle, sinon une longue et systématique curiosité.
la curiosité est une condition essentielle du progrès.
0
Utilisateur anonyme
13 févr. 2014 à 00:32
j'ai parlé de calcul indéterminer Je n'ai pas dit non plus que tu en avais parlé.Je disais seulement que l'évaluation de 10+3*8 en C ne comporte aucune ambiguïté qui puisse de près ou de loin s'apparenter à un résultat erroné, alors que le résultat de i++/i++ n'est pas prédictible.
Ton exemple revient sur l'ordre d'évaluation... ce qui résume un peu mon exemple D'abord, je trouve rigolo que tu trouves que mon exemple résume le tien, alors que tu as donné le tien après moi.Ensuite, nos exemples n'ont aucun rapport : l'évaluation du tien est parfaitement claire et définie par les règles du C, le mien est indéterminé. Je te rappelle qu'au départ, c'est toi qui demandais un exemple de résultat faussé et, comme tu ne définissais pas cette notion (qu'est-ce que c'est qu'un résultat faussé ?) je t'ai proposé ce qui à mon avis pouvait y ressembler.

vouloir comprendre les choses et savoir comment ça marche, ne fais pas de nous des incompétents D'abord, j'avais bien précisé que je ne parlais d'incompétence que dans le cas où faisait ça pour autre chose que "pour voir", car toi tu parlais de pilotage de processus physique. Et je maintiens ce point de vue. Mais surtout, regarder le résultat d'une expression indéterminée ne t'apprendra pas comment quoi que ce soit marche. Ou à la rigueur comment se comporte un compilateur particulier dans un cas particulier, mais c'est une connaissance tout à fait stérile. Pour apprendre quelque chose, il vaut mieux lire les spécifications du langage (voir le lien que je t'ai donné) que d'essayer des expressions au hasard, simplement parce qu'on les trouve jolies ou bizarres.
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
15 févr. 2014 à 20:43
bonsoir après re-lecture décidément, on n'est pas sur la même fréquence et encore moins précis de ma part dans les explications ceci dit, tu parles de calcul indéterminer avec un exemple précis et moi de calcul erroné prénom en compte l'ordre des évaluations des opérateurs.

Ceci étant que moi j'exposais en problème à la quel je trouve assez tordu et d'ailleurs pour le trouver j'ai dû faire un truc tordu(incompétent) et j'ai trouvé d'où ça venait. Et l'exemple du processus est bien réel, parce que juste avant qu'un intérimaire quitte son poste celui-ci a mis à jour une application interne et a procédé au déploiement sachant très bien que l'application pilote des sous-stations de réfrigérations, histoire de modifier la température et faire chier son monde (faute due à une promesse d'embauche à la fin de son contrat qui n'a pas été reconduit) bref le bon moyen.


pvar=&pVar;
++pvar*0;
pVar+=1;
pvar++;
++pVar;
--pvar;

Et ça il l'a disséminé partout dans le code(j'ai du faire la même manip pour comprendre d'où je suis assez tordu pour le faire).et également, des erreurs de ma part à vouloir mal comprendre ce que tu as exposé au deuxième poste MAIS AUSSI LE FAIT DE D' ECRIRE LE MOT IMCOMPETENCE grrr, mais bon ce n'est pas grave, l'erreur vient de moi j'ai mal compris. je m'en excuse (mais le mots incompétents grrrrrr mal passé Lol), mais merci a toi de tes remarque je laisse en résolus et si d'autres personnes en des commentaires à propos faite nous part de ça à bientôt
0