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 régulier Avatar de guitariste
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 245
    Points : 108
    Points
    108
    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 sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    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 ===|

  3. #3
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    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 régulier Avatar de guitariste
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 245
    Points : 108
    Points
    108
    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 : 50
    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
    Points : 16 213
    Points
    16 213
    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.

  6. #6
    Membre régulier Avatar de guitariste
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 245
    Points : 108
    Points
    108
    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 sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    ben, du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int *i=new int(10 , 7);
    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]

  8. #8
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    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 sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    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

  10. #10
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    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 régulier Avatar de guitariste
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 245
    Points : 108
    Points
    108
    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 éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 393
    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 393
    Points : 20 496
    Points
    20 496
    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