IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

que fait ce code !


Sujet :

C++

  1. #1
    Membre �clair� Avatar de guitariste
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    245
    D�tails du profil
    Informations personnelles :
    �ge : 45
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 245
    Par d�faut que fait ce code !
    salut.
    j'arrive pas a comprendre ce que fait ce code
    ca me parait comme un appel du constructeur de la classe int() !!?
    mais je pense qu'en C++ int n'est pas une classe ?
    ca marche meme si je fais par exemple

    et il ya encore la valeur 10 dans a !
    je ne vois pas vraiment un sens

  2. #2
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    le type int est un type primitif, et, � ce titre, on ne peut donc effectivement pas le consid�rer comme �tant une "classe" (ni n'importe quel autre type d�fini par l'utilisateur tel que structure, union, �num�ration ou d�finition de type)...

    Cependant, pour des raisons d'homog�n�it� et de coh�rence de codage, le C++ fournit des "pseudo constructeurs" pour les type primitifs.

    Ces "pseudo constructeurs" r�agissent exactement de la mani�re dont on s'attend � ce qu'il r�agissent g�n�ralement: en initialisant la valeur du type primitif (cela pourrait tout aussi bien se faire avec un char, un short, un long... )

    Le code fait donc exactement ce que tu subodore: il demande l'allocation dynamique pour un entier, et s'arrange pour que cet entier soit initialis� � 10

    Cependant, je suis surpris que la version avec deux valeurs
    accepte ne fusse que de compiler...

    Chez moi (sous windows XP, en utilisant code::blocks et Gcc), j'obtiens une toute belle erreur
    ||=== forumcpp, Debug ===|
    D:\projects\forumcpp\main.cpp||In function 'int main()': |
    D:\projects\forumcpp\main.cpp|7|erreur: new initializer liste d'expressions trait�e comme une expression compos�e|
    D:\projects\forumcpp\main.cpp|7|attention : left-hand operand of comma n'a pas d'effet|
    D:\projects\forumcpp\main.cpp|7|attention : unused variable 'i'|
    ||=== Build finished: 3 errors, 0 warnings ===|
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  3. #3
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    D�tails du profil
    Informations personnelles :
    �ge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par d�faut
    Salut,

    � mon avis guitariste voulait plut�t dire:

    En fait, vu que la conversion float->int existe, il n'y a pas de probl�mes.

  4. #4
    Membre �clair� Avatar de guitariste
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    245
    D�tails du profil
    Informations personnelles :
    �ge : 45
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 245
    Par d�faut
    salut .
    et ben je vous assure que c'est pas une faute !

    ce code compile chez moi:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include "stdafx.h"
    #include <iostream>
     
    using namespace std;
    int _tmain(int argc, _TCHAR* argv[])
    {
     
    	int *a =new int(10,7);
    	char i;
    	cout<< *(a) << endl;
    	cin>> i;
    	return 0;
    }
    et j'obtient un beau "7" comme resulat (et non pas 10 comme j'ai d�j� dit )

    os: xp
    ide :visual studio express 2008

  5. #5
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    L'op�ratuer ',' existe. Il �value ses deux arguments, et retourne l'�l�ment de droite.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    int a = 12, 15, 42; // ici, a vaut 42.
    L� o� je l'ai vu le plus utilis�, c'est dans des boucles :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    for (int i=0 ; it != v.end() ; ++i, ++it)
    Maintenant, dans ce contexte, la virgule ne devrait pas �tre interpr�t�e comme l'op�ratuer ',', mais comme un s�parateur d'arguments, donc je pense que ce code ne devrait pas compiler.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  6. #6
    Membre �clair� Avatar de guitariste
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    245
    D�tails du profil
    Informations personnelles :
    �ge : 45
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 245
    Par d�faut
    Citation Envoy� par JolyLoic
    Maintenant, dans ce contexte, la virgule ne devrait pas �tre interpr�t�e comme l'op�ratuer ',', mais comme un s�parateur d'arguments, donc je pense que ce code ne devrait pas compiler.
    de quel code tu parles ?

  7. #7
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    ben, du code
    Si ton compilateur accepte ce code et qu'il te fournit la valeur 7 quand tu demande l'affichage de *i, c'est sans doute que l'impl�mentation prend des libert�s avec une fonctionnalit� "ind�finie"

    Tu devrais essayer de r�gler ton compilateur de mani�re � le faire travailler plus "parano�aque", car c'est typiquement le genre de comportement qu'il vaut mieux �viter, et pour comprendre pourquoi il faut l'�viter, reprenons les explications depuis le d�but:
    Citation Envoy� par JolyLoic Voir le message
    L'op�ratuer ',' existe. Il �value ses deux arguments, et retourne l'�l�ment de droite.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    int a = 12, 15, 42; // ici, a vaut 42.
    L� o� je l'ai vu le plus utilis�, c'est dans des boucles :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    for (int i=0 ; it != v.end() ; ++i, ++it)
    Citation Envoy� par koala01 Voir le message
    le type int est un type primitif, et, � ce titre, on ne peut donc effectivement pas le consid�rer comme �tant une "classe" (ni n'importe quel autre type d�fini par l'utilisateur tel que structure, union, �num�ration ou d�finition de type)...

    Cependant, pour des raisons d'homog�n�it� et de coh�rence de codage, le C++ fournit des "pseudo constructeurs" pour les type primitifs.

    Ces "pseudo constructeurs" r�agissent exactement de la mani�re dont on s'attend � ce qu'il r�agissent g�n�ralement: en initialisant la valeur du type primitif (cela pourrait tout aussi bien se faire avec un char, un short, un long... )

    Le code fait donc exactement ce que tu subodore: il demande l'allocation dynamique pour un entier, et s'arrange pour que cet entier soit initialis� � [CORRECTION] la derni�re valeur fournie[/CORRECTION]
    Citation Envoy� par JolyLoic Voir le message
    Maintenant, dans ce contexte, la virgule ne devrait pas �tre interpr�t�e comme l'op�ratuer ',', mais comme un s�parateur d'arguments, donc je pense que ce code ne devrait pas compiler.
    et je rejoins son avis

    [EDIT]Il semblerait que l'impl�mentation de ton compilateur prenne des libert�s avec une fonctinnalit� qui est sans doute pr�sent�e comme "ind�finie" dans la norme.

    Je te conseillerais fortement de r�gler ton compilateur pour qu'il travaille de mani�re plus "parano�aque" (niveau d'avertissements et d'erreur plus �lev�s), car le code que tu �cris peut tout � la fois initialiser l'entier point� par i � 7 que lancer une attaque nucl�aire sur Moscou, selon le compilateur que tu utilisera...

    Nous t'avons expliqu� le pourquoi et le comment du comportement que tu as observ�.

    Nous avons attir� ton attention sur les probl�mes que cela pouvait engendrer.

    Maintenant, c'est � toi de prendre les dispositions qui s'imposent
    [/EDIT]
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  8. #8
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    D�tails du profil
    Informations personnelles :
    �ge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par d�faut
    Salut,

    j'ai r�ussi � le faire compiler sous gcc:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
        int *a = new int((10, 7));
     
        cout << *a << endl;
     
        return 0;
    }
    Mais c'est un bricolage...

  9. #9
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Citation Envoy� par coyotte507 Voir le message
    Salut,

    j'ai r�ussi � le faire compiler sous gcc:
    <snip>
    Mais il faut bien comprendre qu'une compilation sans erreur n'est absolument pas synonyme d'application sans erreur...

    Une compilation sans erreur ne veut dire qu'une seule chose: c'est que tu as respecter les r�gles qui r�gissent la compilation (regarde tout simplement les probl�mes que l'on peut rencontrer avec une compilation sans erreur, mais en utilisant un pointeur non ou mal initialis� ).

    Il vaut � la limite mieux que la compilation �choue parce qu'un probl�me (m�me potentiel) a �t� d�tect�, plut�t que de laisser un probl�me r�el et pr�sent dans une application.

    En effet, si un probl�me est pr�sent dans l'application, avec un peu de (mal)chance, l'application passera tous les tests que tu fera avant la mise en "production"... et plantera lamentablement le jour de la pr�sentation (Bill Gates en sait quelque chose )

    Et tu pourras alors t'estimer heureux de voir que ce n'est que ton application qui plante
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  10. #10
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    D�tails du profil
    Informations personnelles :
    �ge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par d�faut
    Citation Envoy� par koala01 Voir le message
    Mais il faut bien comprendre qu'une compilation sans erreur n'est absolument pas synonyme d'application sans erreur...

    Une compilation sans erreur ne veut dire qu'une seule chose: c'est que tu as respecter les r�gles qui r�gissent la compilation (regarde tout simplement les probl�mes que l'on peut rencontrer avec une compilation sans erreur, mais en utilisant un pointeur non ou mal initialis� ).

    Il vaut � la limite mieux que la compilation �choue parce qu'un probl�me (m�me potentiel) a �t� d�tect�, plut�t que de laisser un probl�me r�el et pr�sent dans une application.

    En effet, si un probl�me est pr�sent dans l'application, avec un peu de (mal)chance, l'application passera tous les tests que tu fera avant la mise en "production"... et plantera lamentablement le jour de la pr�sentation (Bill Gates en sait quelque chose )

    Et tu pourras alors t'estimer heureux de voir que ce n'est que ton application qui plante
    Salut,

    tout � fait d'accord, c'�tait juste pour montrer comment enlever le comportement ind�fini. Mais �crire ce genre de choses dans des fonctions risque dans la plupart des cas de rendre le code difficile � lire.

  11. #11
    Membre �clair� Avatar de guitariste
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    245
    D�tails du profil
    Informations personnelles :
    �ge : 45
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 245
    Par d�faut
    Citation Envoy� par koala01
    Nous t'avons expliqu� le pourquoi et le comment du comportement que tu as observ�.

    Nous avons attir� ton attention sur les probl�mes que cela pouvait engendrer.

    Maintenant, c'est � toi de prendre les dispositions qui s'imposent
    oui ....les choses sont plus claires pour moi maintenant ...et je vais prendre les dispositions qui s'imposent

    Merci pour toutes les r�ponses.

  12. #12
    Expert confirm�
    Avatar de Mat.M
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 539
    D�tails du profil
    Informations personnelles :
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 539
    Par d�faut
    Je crois qu'il y a erreur
    Citation Envoy� par guitariste Voir le message
    salut.
    j'arrive pas a comprendre ce que fait ce code
    ce code, le compilateur affecte un pointeur de type integer une allocation d'une valeur de type integer mais � la diff�rence pr�s qu'un transtypage ( cast en anglais ) est effectu�
    Donc logiquement tu n'alloues qu'une seule variable de type integer de valeur 10 et non un tableau de 10 variables...
    int(..) sera consid�r� comme un cast par le compilateur...
    int() par exemple est souvent utilis� pour transtyper des r�els ou variables � virgules flottantes ou bien pour calculer la partie enti�re...

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Fonction myst�re - Que fait ce code ?
    Par jeyGey dans le forum C
    R�ponses: 2
    Dernier message: 16/01/2013, 13h43
  2. Que fait ce code ?
    Par vieuxmonsieur dans le forum Macros et VBA Excel
    R�ponses: 4
    Dernier message: 19/09/2012, 13h17
  3. Que fait ce code ?
    Par teol91 dans le forum x86 32-bits / 64-bits
    R�ponses: 9
    Dernier message: 24/10/2011, 10h38
  4. que fait ce code
    Par improcess dans le forum Images
    R�ponses: 4
    Dernier message: 02/10/2011, 14h39
  5. que fait ce code (et surtout pourquoi??)
    Par elekis dans le forum C++
    R�ponses: 3
    Dernier message: 13/09/2005, 10h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo