Bonjour,
quelle est la différence entre les deux instructions "i++;" et "i+=1;" ?
Ces deux instructions sont supposées à l'exterieur de toute boucle ou test.
Version imprimable
Bonjour,
quelle est la différence entre les deux instructions "i++;" et "i+=1;" ?
Ces deux instructions sont supposées à l'exterieur de toute boucle ou test.
Salut,
Bien franchement je ne pense pas qu'il y en ai. i++; est simplement une façon plus courte d'écrire i += 1;
Euh... j'ai oublié de dire une chose :
il y a une différence parce que je viens de résoudre un bug et le problème était que j'avais écrit "i++;" au lieu de "i+=1;"
EDIT : Compilo : Visual Studio 2008
Sur ce point, il y a une différence entre i++ et ++i:
++i est exactement identique à i+=1 (hormis la priorité, qui peut nécessiter l'ajout de parenthèses).
i++ est différent parce qu'il retourne l'ancienne valeur.
Alors ça c'est vraiment curieux.
C'est peut-être le fait de mettre cette instruction dans une macro qui a fait du caca. Bug de VS?
Non, mais tu as sans doute utilisé la valeur retournée quelque part...
Voila le code qui pose problème :
Changer "Tableau+=1;" en "Tableau++;" produit des résultats différents. Par contre je n'ai pas poussé l'analyse bien loin, j'ai juste constaté que ça marchait pas bien.Code:
1
2
3 #define SET_CASE(Tableau, i) \ Tableau |= (1<<(i+7)); \ Tableau+=1;
Note : Au début j'avais mis "((unsigned char *)Tableau)++;" et ça marchait très bien, mais j'avais un warning comme quoi c'est pas standard de faire un cast sur une l-value.
Peux-tu montrer les appels à cette macro?
Car ici, il n'y a rien qui montre le problème si Tableau est un bète pointeur.
Essaie aussi avec des parenthèses:
Code:
1
2
3 #define SET_CASE(Tableau, i) \ (Tableau) |= (1<<(i+7)); \ (Tableau)+=1;
Si tu fais SET_CASE(*unpointeur), la priorité devient importante, et ++ est prioritaire sur *, contrairement à +=. Comme je l'ai dit dans un message plus haut.Code:
1
2
3 #define SET_CASE(Tableau, i) \ (Tableau) |= (1<<(i+7)); \ (Tableau)++;
...d'une manière générale, il faut toujours entourer les arguments d'une macro (et souvent la macro elle-même, quand elle retourne une valeur) de parenthèses, pour éviter ce genre de problèmes.
Oui bien sûr, ça ne peut être que ça.
Merci pour ton aide.
Il ont la même priorité (15) à condition que ++ soit préfixé. Si ++ est postfixé, il a une priorité supérieure (16).Citation:
étonnant, je pensais pourtant que ++ et * avaient la même priorité (priorité 14), on m'aurait mentit ?
Excuses-moi, mais la priorité 15 c'est seulement pour les opérateurs de champ et d'indirection et les parenthèses (et crochets), ou bien ces derniers ont la priorité 16 (j'avais appris qu'il y avait seulement 15 niveaux de priorité, après peut être que cela dépend des cours) ?
Il y a le tableau des priorités ici : http://c.developpez.com/cours/bernar...ne/node101.php
Merci,
Il est légèrement différent du tableau que je possède déjà mais surement plus juste ;) (la preuve) ...