Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1304 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++] taz, help, 3 questions sur la syntaxe

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] taz, help, 3 questions sur la syntaxe

n°1300721
jesus_chri​st
votre nouveau dieu
Posté le 07-02-2006 à 19:25:40  profilanswer
 

1) Quelles sont les conditions pour déclarer une variable dans un if ?
Une fois sur 2 mon compilo refuse, sans que je sache pkoi, et le stroutrup n'est pas très explicite sur ce point.
Faut-il que la variable soit const, qu'elle soit initialisée par son constructeur de copie ou un truc du genre ?
Ou est-ce juste visual c++ 7 qui merde ?
 
2) Peut-on faire de la composition de fonctor object avec la STL ? Je ne parle pas de boost mais de la STL !
Je n'ai rien trouvé dans la ref, étrange.
 
3)

Code :
  1. int f() { return 42; }
  2. const int& g() { return 42; }
  3. const int& h() { int a = 42; return a; }
  4. int& m() { return 42; }
  5. const int& a = f(); // correct
  6. const int& b = g(); // ??
  7. const int& c = h(); // ??
  8. const int& d = m(); // ??
  9. int        e = m(); // ??


 
la première affectation est correcte, mais si "int" était un type complet (class ou struct), y aurait-il économie d'un appel au constructeur de copie par rapport au cas où a serait un objet et pas une ref ?
Les autres sont-elles correctes ?

mood
Publicité
Posté le 07-02-2006 à 19:25:40  profilanswer
 

n°1300723
chrisbk
-
Posté le 07-02-2006 à 19:28:40  profilanswer
 

declarer une variable dans un if ? c'est pas un peu de la perversion ca ?
 

n°1300726
jesus_chri​st
votre nouveau dieu
Posté le 07-02-2006 à 19:35:40  profilanswer
 

c'est conseillé dans le stoustrup pour maximiser la "localisation" des variables et l'utilisation de const.
 
if (const int n = t.toto())
   r += n;
 
un truc du genre :D
Mais c'est vrai que c'est tellement peu habituel que ça n'a pas été repris dans le C99 alors que la déclaration dans le for a été ajoutée.

n°1300728
chrisbk
-
Posté le 07-02-2006 à 19:41:13  profilanswer
 

mais ca ne veut rien dire ca ? [:le kneu]

n°1300729
chrisbk
-
Posté le 07-02-2006 à 19:41:43  profilanswer
 

ou alors ecrit  
 
if (t.toto())
 
enfin j'imagine c'est un exemple, mais jtrouve ca fait tres "je charge mon if comme un mulet" :d

n°1300731
nraynaud
lol
Posté le 07-02-2006 à 19:52:09  profilanswer
 

chrisbk a écrit :

mais ca ne veut rien dire ca ? [:le kneu]


si, c'est la généralisation de

Code :
  1. for(int i = ...;;) {}

ben là tu as

Code :
  1. if(int i=..) {}

c'est logique [:pingouino]
 
 
 
edit: dans la tête à Stroumachin.


Message édité par nraynaud le 07-02-2006 à 19:52:46
n°1300735
++fab
victime du syndrome IH
Posté le 07-02-2006 à 19:56:59  profilanswer
 

jesus_christ a écrit :

1) Quelles sont les conditions pour déclarer une variable dans un if ?
Une fois sur 2 mon compilo refuse, sans que je sache pkoi, et le stroutrup n'est pas très explicite sur ce point.
Faut-il que la variable soit const, qu'elle soit initialisée par son constructeur de copie ou un truc du genre ?
Ou est-ce juste visual c++ 7 qui merde ?


 
C'est légal. Montre un exemple qui ne fonctionne pas stp.
 

Citation :

2) Peut-on faire de la composition de fonctor object avec la STL ? Je ne parle pas de boost mais de la STL !
Je n'ai rien trouvé dans la ref, étrange.


 
?
 

jesus_christ a écrit :


3)

Code :
  1. int f() { return 42; }
  2. const int& g() { return 42; }  // reference const à un temporaire. Légal mais catastrophique.
  3. const int& h() { int a = 42; return a; }// reference const à une variable locale. Légal mais catastrophique.
  4. int& m() { return 42; } // assignation d'un temporaire à une reference non const : illégal
  5. const int& a = f(); // correct
  6. const int& b = g(); // ??
  7. const int& c = h(); // ??
  8. const int& d = m(); // ??
  9. int        e = m(); // ??


 
la première affectation est correcte, mais si "int" était un type complet class (class ou struct, ( + union) ), y aurait-il économie d'un appel au constructeur de copie par rapport au cas où a serait un objet et pas une ref ?


 
<edit>Oui dans un cas simple</edit>. Le compilateur a le droit de construire l'objet "sur" la valeur de retour. C'est le NRVO.


Message édité par ++fab le 07-02-2006 à 20:11:49
n°1300740
Taz
bisounours-codeur
Posté le 07-02-2006 à 20:06:07  profilanswer
 

1) c'est vc7 :)
 
le reste je lis :)

n°1300742
Taz
bisounours-codeur
Posté le 07-02-2006 à 20:19:37  profilanswer
 

2) sur la composition en stl : bah effectivement, y a rien si je me souviens bien.
 
3) t'en as pas marre de nous renvoyer des références à des variables locales ? le mieux c'est de regarder ... bah gcc, il est pas con, il voit bien que tu fais du caca, donc il fait du caca, il te renvoit ta référence comme demandée, seulement comme c'est du local, ben il te renvoit du bidon, il construit rien du tout :)

n°1300743
++fab
victime du syndrome IH
Posté le 07-02-2006 à 20:28:44  profilanswer
 

jesus_christ a écrit :

c'est conseillé dans le stoustrup pour maximiser la "localisation" des variables et l'utilisation de const.
if (const int n = t.toto())
   r += n;


on voit plus souvent ça :
int const n = t.toto();
if( n )
    r += n;
Ce qui est clairement moins bon.

jesus_christ a écrit :


Mais c'est vrai que c'est tellement peu habituel que ça n'a pas été repris dans le C99 alors que la déclaration dans le for a été ajoutée.


on sent bien dans tous ces choix moisis depuis 90, que le C est au bout du rouleau (troll inside).

mood
Publicité
Posté le 07-02-2006 à 20:28:44  profilanswer
 

n°1302573
jesus_chri​st
votre nouveau dieu
Posté le 09-02-2006 à 23:31:54  profilanswer
 

1) fait chier VC++, merci GCC4
 
2) ils avaient mal dormi au commité C++ ? Je l'ai recodé à la main le composeur ça fait 8 lignes, ils auraient pu standardiser ça, c'est pas méchant :(
 
3) taz : justement renvoyer une ref constante initialisée avec une constante littérale (comme dans g()) ça peut être légal. Sinon oui je sais pour la durée de vie des locales ;) mais en C++ c'est du sucre syntaxique cette ppté sur const T& qui ne marche pas pour T&.

n°1302685
Taz
bisounours-codeur
Posté le 10-02-2006 à 10:43:42  profilanswer
 

2) passe à boost, c'est quand même terriblement mieux.

n°1303210
jesus_chri​st
votre nouveau dieu
Posté le 10-02-2006 à 18:41:42  profilanswer
 

2) t'aurais un bon site sur boost (sinon oui je connais google, c'est pour pas perdre de temps)
 
3) tu connais pas la réponse explicitement, parce que teser sur un compilo, même gcc, c'est pas très strict comme méthode.
 
++fab : c'est vrai que de nombreux ajout du C99 sont étranges, c'est soit du sucre syntaxique bizarre qui rend le code encore + dur à lire, soit des extentions qui cassent beaucoup de conventions comme
int n = rand();
int tab[n]; // taille dynamique
sizeof tab // ce n'est pas une constante !
 
par contre les bons trucs du C++ ont été ajoutés, comme ça avait été le cas en 89 déjà (car le C++ c'est vieux qd même), les commentaires //, for (int i...), déclaration = instruction, bool, complex.
inline et restrict ça peut être utile pour l'optimisation, car le C il ne lui reste plus grand chose d'autre.

n°1303360
Evadream -​jbd-
Posté le 11-02-2006 à 06:26:22  profilanswer
 

2) La documentation de boost est plutôt bien faite !
 
J'ai acheté un bouquin que j'ai vu passé sur la mailing list. Le ton est abordable, les exemples sont simples et illustrent chacun des concepts abordés. J'avais un peu de mal avec certains aspects de la documentation web, maintenant ça va bien mieux :)
 
http://images-eu.amazon.com/images/P/0321133544.01.MZZZZZZZ.jpg
 
http://www.amazon.fr/exec/obidos/A [...] 32-2397079

n°1303666
el muchach​o
Comfortably Numb
Posté le 12-02-2006 à 11:22:03  profilanswer
 

chrisbk a écrit :

ou alors ecrit  
 
if (t.toto())
 
enfin j'imagine c'est un exemple, mais jtrouve ca fait tres "je charge mon if comme un mulet" :d


C'est un peu comme ceux qui ecrivent tout leur programme dans une boucle for.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°1303667
chrisbk
-
Posté le 12-02-2006 à 11:22:47  profilanswer
 

bah nan

n°1303668
chrisbk
-
Posté le 12-02-2006 à 11:22:56  profilanswer
 

enfin un peu

n°1303669
chrisbk
-
Posté le 12-02-2006 à 11:23:00  profilanswer
 

mais pas que

n°1303670
el muchach​o
Comfortably Numb
Posté le 12-02-2006 à 11:25:11  profilanswer
 

Evadream -jbd- a écrit :

2) La documentation de boost est plutôt bien faite !
 
J'ai acheté un bouquin que j'ai vu passé sur la mailing list. Le ton est abordable, les exemples sont simples et illustrent chacun des concepts abordés. J'avais un peu de mal avec certains aspects de la documentation web, maintenant ça va bien mieux :)
 
http://images-eu.amazon.com/images/P/0321133544.01.MZZZZZZZ.jpg
 
http://www.amazon.fr/exec/obidos/A [...] 32-2397079


La couverture [:le kneu]


Message édité par el muchacho le 12-02-2006 à 11:25:38

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°1304701
++fab
victime du syndrome IH
Posté le 13-02-2006 à 19:38:27  profilanswer
 

jesus_christ a écrit :

1) fait chier VC++, merci GCC4


Pas besoin d'attendre la version 4 pour ça !
 

Citation :

2) ils avaient mal dormi au commité C++ ? Je l'ai recodé à la main le composeur ça fait 8 lignes, ils auraient pu standardiser ça, c'est pas méchant :(

A quoi ça ressemble tout ça ?
 

Citation :


3) taz : justement renvoyer une ref constante initialisée avec une constante littérale (comme dans g()) ça peut être légal.  
Sinon oui je sais pour la durée de vie des locales ;)  


Assigner une littérale constante à une reférence const, c'est légal. Dans g(), c'est plutot une littérale flottante. Vu que c'est une rvalue, tu as le droit de l'assigner à une référence constante. Ce qui se passe, c'est qu'un temporaire est crée au moment de lassignation, et il a -- dans ce cas -- la durée de vie de la scope. 42 est dans la scope de g(), et le temporaire meurt prématurément.
 

Citation :

mais en C++ c'est du sucre syntaxique cette ppté sur const T& qui ne marche pas pour T&.


Si un T& fonctionnait comme un T const&, ça poserait pas mal de problèmes.

n°1304711
++fab
victime du syndrome IH
Posté le 13-02-2006 à 19:51:33  profilanswer
 

Citation :

2) ++fab : c'est vrai que de nombreux ajout du C99 sont étranges, c'est soit du sucre syntaxique bizarre qui rend le code encore + dur à lire, soit des extentions qui cassent beaucoup de conventions comme
int n = rand();
int tab[n]; // taille dynamique
sizeof tab // ce n'est pas une constante !

La norme qui casse les conventions (quand ce n'est pas du code), c'est la routine des programmeurs C.   :sol:  
 

Citation :

par contre les bons trucs du C++ ont été ajoutés, comme ça avait été le cas en 89 déjà (car le C++ c'est vieux qd même)

En 89, le C a aussi pas mal ignoré le C++, alors qu'il était déjà bien là.
 

Citation :

, les commentaires //, for (int i...), déclaration = instruction, bool, complex.
inline et restrict ça peut être utile pour l'optimisation, car le C il ne lui reste plus grand chose d'autre.


C'est surement pas inline et restrict qui vont contribuer à sa survie  :sol:


Message édité par ++fab le 13-02-2006 à 19:52:19
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++] taz, help, 3 questions sur la syntaxe

 

Sujets relatifs
[Perl] Tk, Quelques questionsHelp me!
IE vs firefox, BUG de CSS!! help ???Pb syntaxe sql
Petites questions sur les SGBDs en généralScript vba pour diriger autre programme...need help ;)
pb syntaxe dans Rowsource vba excelControler syntaxe MDP saisi
awk syntaxe... erreursQuelques questions php
Plus de sujets relatifs à : [C++] taz, help, 3 questions sur la syntaxe


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR