[C/C++] Affectation ou test ? Quel est le mieux ?

Affectation ou test ? Quel est le mieux ? [C/C++] - C++ - Programmation

Marsh Posté le 03-06-2003 à 13:42:46    

Salut,
On a une boucle
 
int toto;
 
for(i=0;i<50;i++)
{
if(var[i] == 6)
   toto = 6;
}
 
ce qui fait qu'à chaque fois que var[i] == 6 on affecte à toto la valeur 6; mais mettons que var[] contiennent dix 6, on affectera à toto dix fois la même valeur, donc ne vaut-il mieux pas tester si toto == 6 et si ce n'est pas le cas on affecte, plutot que d'affecter à chaque fois ?
merci
    ANT


Message édité par antsite le 03-06-2003 à 13:45:50
Reply

Marsh Posté le 03-06-2003 à 13:42:46   

Reply

Marsh Posté le 03-06-2003 à 13:45:32    

non

Reply

Marsh Posté le 03-06-2003 à 13:52:59    

de toute façon, toto ne doit être affecté que si au moins une valeur de ton tableau == 6, donc pas besoin de tester tout le tableau :
 

Code :
  1. int i = 0;
  2. while ((i<50) || (toto != 6))
  3. {
  4.    if (var[i] == 6)
  5.       toto = 6;
  6.    i++;
  7. }


 
edit: parenthèses


Message édité par Harkonnen le 03-06-2003 à 13:55:02

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 03-06-2003 à 13:53:53    

perso j'aurais fait un break [:ciler]

Reply

Marsh Posté le 03-06-2003 à 13:55:00    

Harkonnen a écrit :

de toute façon, toto ne doit être affecté que si au moins une valeur de ton tableau == 6, donc pas besoin de tester tout le tableau :
 

Code :
  1. int i = 0;
  2. while ((i<50) || (toto != 6))
  3. {
  4.    if var[i] == 6
  5.       toto = 6;
  6.    i++;
  7. }




c'est moyen non, tu testes toto sans l'initialiser...et à chaque tour de boucle!
Il suffit de rajouter un break dans son if, non?
 
[edit]
Grillaid par chrisbk...mais moi j'ai esspliké  :whistle:


Message édité par skeye le 03-06-2003 à 13:56:32
Reply

Marsh Posté le 03-06-2003 à 13:55:37    

chrisbk a écrit :

perso j'aurais fait un break [:ciler]


 
Argh, pas beau le break, si ton for ressemble à un while, met un while.


---------------
Le Tyran
Reply

Marsh Posté le 03-06-2003 à 13:56:12    

C'est vrai que pas besoin de tester tout le tableau dans ce cas, mais pour mon affaire c'est pas 6 mais c'est 1 2 3 4 5 6, donc je peux pas y couper?

Reply

Marsh Posté le 03-06-2003 à 13:56:15    

skeye a écrit :


c'est moyen non, tu testes toto sans l'initialiser...et à chaque tour de boucle!
Il suffit de rajouter un break dans son if, non?
 


oui, toto doit bien évidemment être initialisé, oubli de ma part.
je suis pas fan des break, ça a tendance à faire du code spaghetti.


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 03-06-2003 à 13:56:29    

int i=0;
while (i<50)
{
   if (tab[i++] == 6)
      {
          toto = 6;
          break; // ou i=50;
      }
}
 
EDIT : le break fonctionne aussi avec une boucle for comme celle que t'avais au depart


Message édité par polo021 le 03-06-2003 à 13:58:34
Reply

Marsh Posté le 03-06-2003 à 13:56:41    

LetoII a écrit :


 
Argh, pas beau le break, si ton for ressemble à un while, met un while.


pas du tout, je trouve ca elegant, et dans son cas c plutot son while qui ressemble a un for que l'inverse
 
le break est injustement diabolisé :O

Reply

Marsh Posté le 03-06-2003 à 13:56:41   

Reply

Marsh Posté le 03-06-2003 à 13:56:44    

LetoII a écrit :


 
Argh, pas beau le break, si ton for ressemble à un while, met un while.

:jap:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 03-06-2003 à 13:57:15    

polo021 a écrit :

int i=0;
while (i<50)
{
   if (tab[i++] == 6)
      {
          toto = 6;
          break; // ou i=50;
      }
}


 
c moche et c'est nul, tu sors :O

Reply

Marsh Posté le 03-06-2003 à 13:58:00    

polo021 a écrit :

int i=0;
while (i<50)
{
   if (tab[i++] == 6)
      {
          toto = 6;
          break; // ou i=50;
      }
}


bouh j'aime pas le tab[i++]...je trouve pas ca lisible, même si ca n'engage que moi!

Reply

Marsh Posté le 03-06-2003 à 13:58:32    

sorry, mais en terme de perfs, mon code est plus efficace ! je n'écrit qu'une seule fois dans la RAM !
 
edit: en dehors de l'incrémentation de i bien entendu


Message édité par Harkonnen le 03-06-2003 à 14:00:19

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 03-06-2003 à 13:59:42    

skeye a écrit :


c'est moyen non, tu testes toto sans l'initialiser...et à chaque tour de boucle!
Il suffit de rajouter un break dans son if, non?
 
[edit]
Grillaid par chrisbk...mais moi j'ai esspliké  :whistle:  


 
Moi j'ai une préférence pour:
 

Code :
  1. int i=0;
  2. int toto;
  3. while (i<50 && (toto = tab[i++]) != 6)
  4. {
  5. }


 
Après comme on sait pas ce qu'il veut en faire...


---------------
Le Tyran
Reply

Marsh Posté le 03-06-2003 à 13:59:55    

Harkonnen a écrit :

sorry, mais en terme de perfs, mon code est plus efficace ! je n'écrit qu'une seule fois dans la RAM !  


Plus efficace que...?
En reprenant son code + un break on n'écrit qu'une fois aussi, non?

Reply

Marsh Posté le 03-06-2003 à 14:00:03    

chrisbk a écrit :


pas du tout, je trouve ca elegant, et dans son cas c plutot son while qui ressemble a un for que l'inverse
 
le break est injustement diabolisé :O


 
je suis bien d'accord  :jap:  c'est le cas typique où un for+break est très pratique.


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 03-06-2003 à 14:00:06    

Harkonnen a écrit :

sorry, mais en terme de perfs, mon code est plus efficace ! je n'écrit qu'une seule fois dans la RAM !  


 
pas aussi efficace qu'un break, tu fais une incrementation et deux tests en plus
et tn plus ta condition est fausse
 
 

Code :
  1. while ((i<50) || (toto != 6))


 
nul, zero, tu sors
 

Code :
  1. while ((i<50) && (toto != 6))


 
c deja mieux
 

Code :
  1. while ((toto != 6)  && (i<50) )


la c encore mieux [:aloy]

Reply

Marsh Posté le 03-06-2003 à 14:00:48    

chrisbk a écrit :


 
c moche et c'est nul, tu sors :O
 


 :love:

Reply

Marsh Posté le 03-06-2003 à 14:01:24    

skeye a écrit :


Plus efficace que...?
En reprenant son code + un break on n'écrit qu'une fois aussi, non?


plus efficace que celui d'ant. j'avais posté sans voir le code de polo


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 03-06-2003 à 14:01:31    


et en plus c faux

Reply

Marsh Posté le 03-06-2003 à 14:01:42    

LetoII a écrit :


 
Moi j'ai une préférence pour:
 

Code :
  1. int i=0;
  2. int toto;
  3. while (i<50 && (toto = tab[i++]) != 6)
  4. {
  5. }


 
Après comme on sait pas ce qu'il veut en faire...


Tu fais tjrs des comparaisons inutiles, à mon sens... [:spamafote]

Reply

Marsh Posté le 03-06-2003 à 14:03:34    

chrisbk a écrit :

et tn plus ta condition est fausse


ben non ! tu sors de la boucle si :
 
- tu as parcouru tout le tableau sans qu'aucun de ses membres ne soit égal à 6 (i < 50)
- un de ses membres est égal à 6
 
ta condition implique que le tableau contient forcément une valeur 6, ce qui ne sera pas forcément le cas [:sinclaire]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 03-06-2003 à 14:03:56    

LetoII a écrit :


 
Moi j'ai une préférence pour:
 

Code :
  1. int i=0;
  2. int toto;
  3. while (i<50 && (toto = tab[i++]) != 6)
  4. {
  5. }


 
Après comme on sait pas ce qu'il veut en faire...


nan paske si y a pas de 6 dans le tableau on aura une mauvaise valeur dans toto et tu affcete a chaque fois  :sweat:

Reply

Marsh Posté le 03-06-2003 à 14:04:16    

Harkonnen a écrit :


ben non ! tu sors de la boucle si :
 
- tu as parcouru tout le tableau sans qu'aucun de ses membres ne soit égal à 6 (i < 50)
- un de ses membres est égal à 6
 
ta condition implique que le tableau contient forcément une valeur 6, ce qui ne sera pas forcément le cas [:sinclaire]


 
le while pour les nuls s'impose :D
 
la tu va tjs parcourir ton tableau en integralite :O


Message édité par chrisbk le 03-06-2003 à 14:05:00
Reply

Marsh Posté le 03-06-2003 à 14:05:29    

skeye a écrit :


Tu fais tjrs des comparaisons inutiles, à mon sens... [:spamafote]


 
Ben non.


---------------
Le Tyran
Reply

Marsh Posté le 03-06-2003 à 14:05:39    

Harkonnen a écrit :


ben non ! tu sors de la boucle si :
 
- tu as parcouru tout le tableau sans qu'aucun de ses membres ne soit égal à 6 (i < 50)
- un de ses membres est égal à 6
 
ta condition implique que le tableau contient forcément une valeur 6, ce qui ne sera pas forcément le cas [:sinclaire]


 :heink:  
ca:

Code :
  1. while ((i<50) || (toto != 6))


Si ya pas de 6 dans le tableau tu sors jamais... [:timour]

Reply

Marsh Posté le 03-06-2003 à 14:05:59    

chrisbk a écrit :


 
le while pour les nuls s'impose :D
 
la tu va tjs parcourir ton tableau en integralite :O


ouais  
harko >  meme si tu as un 6 dans le tableau, avec ton || on ne sortira que si i vaut 50.  :pfff: meme moi je sais ca

Reply

Marsh Posté le 03-06-2003 à 14:07:00    

LetoII a écrit :


 
Ben non.


Tu affectes toto à chaque tour, et à chaque fois tu le compares à 6...alors que ce n'est pas nécéssaire de remplir toto sans y mettre 6, auquel cas tu sais qu'il faut sortir quoi qu'il arrive!

Reply

Marsh Posté le 03-06-2003 à 14:07:46    

polo021 a écrit :


nan paske si y a pas de 6 dans le tableau on aura une mauvaise valeur dans toto et tu affcete a chaque fois  :sweat:  


 
Dans son code toto à pas de valeur avant la boucle donc on s'en fout. Et les affectations par raport aux tests c rapide.


---------------
Le Tyran
Reply

Marsh Posté le 03-06-2003 à 14:08:52    

autant pour moi pour le while  [:yamusha]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 03-06-2003 à 14:08:56    

skeye a écrit :


Tu affectes toto à chaque tour, et à chaque fois tu le compares à 6...alors que ce n'est pas nécéssaire de remplir toto sans y mettre 6, auquel cas tu sais qu'il faut sortir quoi qu'il arrive!


 
Ben ouia, mais je fais pas de comparaison inutile, des affectations ça se discute mais les omparaisons c bon :D


---------------
Le Tyran
Reply

Marsh Posté le 03-06-2003 à 14:09:09    

skeye a écrit :


 :heink:  
ca:

Code :
  1. while ((i<50) || (toto != 6))


Si ya pas de 6 dans le tableau tu sors jamais... [:timour]  


ouais et tu vas lire n'importe ou dans ta memoire. Ben c'est du propre harko! toi qui dit toujours qu'il faut faire gaffe avec les acces memoire en C  :o

Reply

Marsh Posté le 03-06-2003 à 14:09:22    

franchement, hein :
 
 
 

Code :
  1. for(i=0;i<50;i++)
  2. {
  3. if(var[i] == 6)
  4. {
  5.    toto = 6;
  6. break;
  7. }
  8. }


et basta

Reply

Marsh Posté le 03-06-2003 à 14:10:27    

LetoII a écrit :


 
Ben ouia, mais je fais pas de comparaison inutile, des affectations ça se discute mais les omparaisons c bon :D


J'ai rien dit, parlé trop vite! :whistle:

Reply

Marsh Posté le 03-06-2003 à 14:11:10    

chrisbk a écrit :

franchement, hein :
 
 
 

Code :
  1. for(i=0;i<50;i++)
  2. {
  3. if(var[i] == 6)
  4. {
  5.    toto = 6;
  6. break;
  7. }
  8. }


et basta
 


+1

Reply

Marsh Posté le 03-06-2003 à 14:11:25    

polo021 a écrit :


ouais et tu vas lire n'importe ou dans ta memoire. Ben c'est du propre harko! toi qui dit toujours qu'il faut faire gaffe avec les acces memoire en C  :o  


je viens de me farcir une semaine de Pascal à l'insu de mon plein gré, forcément j'ai pas les idées très claires, et le rhume des foins ça aide pas  :sweat:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 03-06-2003 à 14:12:20    

Harkonnen a écrit :


je viens de me farcir une semaine de Pascal à l'insu de mon plein gré, forcément j'ai pas les idées très claires, et le rhume des foins ça aide pas  :sweat:  


 
figure 1 : Comment se tirer d'un mauvais par le truchement d'une excuse bidon et foireuse

Reply

Marsh Posté le 03-06-2003 à 14:12:44    

Harkonnen a écrit :


je viens de me farcir une semaine de Pascal à l'insu de mon plein gré, forcément j'ai pas les idées très claires, et le rhume des foins ça aide pas  :sweat:  


On t'accordera les circonstances attnuantes... :lol:

Reply

Marsh Posté le 03-06-2003 à 14:13:18    

Harkonnen a écrit :


je viens de me farcir une semaine de Pascal à l'insu de mon plein gré, forcément j'ai pas les idées très claires, et le rhume des foins ça aide pas  :sweat:  


et si tu prenais un cours accelere d'excuses bidon chez antp [:spamafote]
 
 
[:toto le hros]
 
EDIT : tu as repondu trop vite petit filou. Bon allez j'arrete


Message édité par polo021 le 03-06-2003 à 14:13:50
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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