condition dans boucles for

condition dans boucles for - C++ - Programmation

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???
 

Reply

Marsh Posté le 09-02-2003 à 22:18:04   

Reply

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

Reply

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???

Reply

Marsh Posté le 09-02-2003 à 22:31:22    

bon j'vais me pioter lirais les reponses demains si d'autre reponses :)
 
Merci bien :)
 
@+

Reply

Marsh Posté le 09-02-2003 à 22:32:09    

oui ca renvoie c

Reply

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 pareil que quand tu fais a = b = c

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 ?

Reply

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)
{
 
}
 

Reply

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

Reply

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 ??

Reply

Marsh Posté le 09-02-2003 à 23:08:33    

oui

Reply

Marsh Posté le 09-02-2003 à 23:08:33   

Reply

Marsh Posté le 10-02-2003 à 10:58:14    

grosmethos a écrit :


for(;(*s1=*S2)!='\0';s1++,S2++)


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...  :sarcastic:  

Reply

Marsh Posté le 10-02-2003 à 18:34:06    

c'est le code de strcpy
 
sauf que j'aurais ecris  
while((*s1++=*s2++) != '\0));

Reply

Marsh Posté le 10-02-2003 à 19:22:10    

++Taz a écrit :

c'est le code de strcpy
 
sauf que j'aurais ecris  
while((*s1++=*s2++) != '\0';));


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à.

Reply

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à  :D

Reply

Marsh Posté le 10-02-2003 à 19:30:31    

++Taz a écrit :

c'est le code de strcpy
 
sauf que j'aurais ecris  
while((*s1++=*s2++) != '\0));

Soyons fou : while (*s1++ = *s2++); , ca revient au même ?

Reply

Marsh Posté le 10-02-2003 à 19:45:24    

oui

Reply

Marsh Posté le 11-02-2003 à 03:40:45    

Code :
  1. a=b=c;
  2. //équivalent
  3. a=(b=c);
  4. //pas tout-à fait équivalent
  5. b=c;
  6. a=b;

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 :
  1. i=t[i]=a;
  2. //cas du terme évalué avant
  3. t[i]=a;
  4. i=t[i];
  5. //cas du terme évalué après
  6. i=a;
  7. t[i]=a;

Alors, c'est pas génial le C ?
 
 
Ceci ne s'applique pas aux type utilisateurs en C++. Ouf !


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

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à  :D  


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.  :sarcastic:
Exemple : Que fait celle ligne ?

Code :
  1. i = v[i++];

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed