condition dans boucles for - C++ - Programmation
Marsh Posté le 09-02-2003 à 22:26:04
*s1 = *s2, ca renvoie la valeur de *s2, que tu peux comparer avec le caractère '\0'.
C'est pareil que quand tu fais a = b = c
Marsh Posté le 09-02-2003 à 22:28:41
je savais pas que l'affectation renvoyer quelque chose....est ce du fait des parenthèse ou dans toujours comme ça??
a=b=c renvoie c alors???
Marsh Posté le 09-02-2003 à 22:31:22
bon j'vais me pioter lirais les reponses demains si d'autre reponses
Merci bien
@+
Marsh Posté le 09-02-2003 à 22:35:12
mrBebert a écrit : *s1 = *s2, ca renvoie la valeur de *s2, que tu peux comparer avec le caractère '\0'. |
c'est toujours comme ca.
Bon, y a surement des subtilités parfois.
Tiens, si a et c sont des entiers sur 4 octets et b sur 2 octets et qu'on fait a = b = c, est-ce que a récupère le contenu de b ou celui de c ?
Marsh Posté le 09-02-2003 à 22:52:15
Si on écrit
if ((a = fonction(b, c)) == 0)
{
}
c'est comme
a = fonction(b, c);
if (a == 0)
{
}
Marsh Posté le 09-02-2003 à 22:56:27
quand je t'ai dit c,c 'est pour la valeur quand tout est du meme type. now, la version longue
l'affectation se passe de droite a gauche
donc quand tu fais
a=b=c=d; c'est comme a=(b=(c=d));
mais a chaque fois l'expression parenthésée prend retourne la valeur de la l-value (la valeur à gauche)
donc
a=b=c vaut donc a et est donc du meme type que a
Marsh Posté le 09-02-2003 à 23:03:26
Ca prend la valeur de gauche ?
Donc, si j'ai a et c des entiers sur 4 octets, et b sur 2 octets.
c = 0x00FFFFFF;
a = b = c;
b, il vaut 0xFFFF. Et a, il vaut 0x0000FFFF ??
Marsh Posté le 10-02-2003 à 10:58:14
grosmethos a écrit : |
Quelle horreur... Quelle peut être l'utilité d'écrire ce genre de ligne de code, à part paumer celui qui la lit et rendre l'optimiseur du compilateur inopérant ?
Il aurait été plus simple d'écrire "strcpy(S2, s1);"...
Notez au passage que ce joli petit bout de code contient un bug caché, à l'origine de nombreuses failles de sécurité des logiciels actuels...
Marsh Posté le 10-02-2003 à 18:34:06
c'est le code de strcpy
sauf que j'aurais ecris
while((*s1++=*s2++) != '\0));
Marsh Posté le 10-02-2003 à 19:22:10
++Taz a écrit : c'est le code de strcpy |
Code que je trouve encore pire que le précédent...
Au passage, rien n'oblige à ce que cette fonction soit écrite en C, et, même si elle l'est, rien n'indique que l'implémentation de strcpy() est effectivement celle-là.
Marsh Posté le 10-02-2003 à 19:25:06
ben non, mais je crois me souvenir que dans l'implémentation que propose le K&R, c'est celle là
Marsh Posté le 10-02-2003 à 19:30:31
++Taz a écrit : c'est le code de strcpy |
Soyons fou : while (*s1++ = *s2++); , ca revient au même ?
Marsh Posté le 11-02-2003 à 03:40:45
Code :
|
Dire que a reçoit la valeur de b après que celui-ci ai reçu celle de c n'est pas tout-à-fait exact.
Strictement parlant, a se voit assigner la valeur de c convertie dans le type de b.
La nuance est subtile, puisque les termes de l'expression peuvent être évalués dans un ordre différent de leur utilsation par les opérateurs :
Code :
|
Alors, c'est pas génial le C ?
Ceci ne s'applique pas aux type utilisateurs en C++. Ouf !
Marsh Posté le 11-02-2003 à 10:38:26
++Taz a écrit : ben non, mais je crois me souvenir que dans l'implémentation que propose le K&R, c'est celle là |
Comme tu le dis très justement, le K&R propose cette implémentation, il ne l'impose pas.
Mais je me demande encore à quoi cela sert d'écrire des lignes dont le comportement n'est pas entièrement déterministe.
Exemple : Que fait celle ligne ?
Code :
|
Marsh Posté le 09-02-2003 à 22:18:04
salut
Je viens de trouver dans un exemple ceci:
for(;(*s1=*S2)!='\0';s1++,S2++)
pas d'initalisation =>ok
arithmetique pointeur s1++=>ok
par contre la condition :(;(*s1=*S2)!='\0' je la comprend pas....
je recopie s1 dans s2....comment le comprarer avec \0???