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 :

[Debutant] Operateur d'incrementation


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Algérie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 90
    Par défaut [Debutant] Operateur d'incrementation
    salut!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #include <stdio.h>
     
    int main(int argc, char *argv[])
    {
       int N, P, Q;
     
       N = 5; P = 2;
       Q = N++ > P || P++ != 3;
       printf ("1 :  N=%d P=%d Q=%d\n", N, P, Q);
     
       N = 5; P = 2;
       Q = N++ < P || P++ != 3;
       printf ("2 :  N=%d P=%d Q=%d\n", N, P, Q);
     
       return 0;
    }
    voila j'ai beau incliner la tete dans tout les sens, je ne vois pas pourquoi P vaut "2" lors du premier printf, et "3" lors du second.
    une idée?

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ici, le flot d'exécution mis en gras:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
       int N, P, Q;
    
       N = 5; P = 2;
       Q = N++ > P (vrai!) || P++ != 3;
       printf ("1 :  N=%d P=%d Q=%d\n", N, P, Q);
    
       N = 5; P = 2;
       Q = N++ < P || P++ != 3;
       printf ("2 :  N=%d P=%d Q=%d\n", N, P, Q);
    
       return 0;
    }
    L'opérateur || n'évalue pas le second argument si le premier est vrai.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par disturbedID
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       Q = N++ > P || P++ != 3;
       Q = N++ < P || P++ != 3;
    Je déconseille formellement d'utiliser les opérateurs unaires (++ etc.) dans les expressions. Au pire, le comportement est indéfini ou dépend de l'implémentation. Au mieux, seuls quelques gourous de niveau 2 ou plus savent vraiment ce qui se passe...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Algérie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 90
    Par défaut
    Ohhhhh quel rapidité merci les gars. je comprend maintenant. c'est vrai, je n'y ai pas pensé. ainsi la deuxieme parti n'est pas évaluée.
    Est ce valable pour tout les compilateur?

    Mais c'est vrai que ce genre d'expression releve plus du jeu du "Keskispaceici" que d'une expression utile a mettre dans de vrais projets.

    mais bien maitriser les prioritée des operateur et bien comprendre la facon de compiler peut apporter une certaine elegance dans un programme

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par disturbedID
    Ohhhhh quel rapidité merci les gars. je comprend maintenant. c'est vrai, je n'y ai pas pensé. ainsi la deuxieme parti n'est pas évaluée.
    Est ce valable pour tout les compilateur?
    EDIT : La norme dit que l'évaluation se fait de gauche à droite et qu'elle cesse dès qu'elle est retourne 1.
    mais bien maitriser les prioritée des operateur et bien comprendre la facon de compiler peut apporter une certaine elegance dans un programme
    ou des catastrophes, c'est selon. Dans mon ex-boite (équipements de réseaux numériques), ce genre de pratique était tout simplement interdite.

    Je me demande si les normes de codage MISRA ne font pas de même.

    Toujours garder en tête que le code doit pouvoir être relu et vérifé de visu par un programmeur lambda (on a pas toujours les moyens de se payer un gourou..)

    Alors le code 'élégant' mais illisible, c'est poubelle directe.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    La norme dit que l'évaluation se fait de gauche à droite et que l'implémentation est libre de court-circuiter ou non.
    Tu veux dire que le test if(unPointeur==NULL || *unPointeur==0) n'est pas garanti par la norme?

    Si c'est bien ce que tu dis, j'entends déjà toute une génération de programmeurs (moi compris) dire un grand "oups!"...

    Edit: OK, j'ai eu peur.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Médinoc
    Tu veux dire que le test if(unPointeur==NULL || *unPointeur==0) n'est pas garanti par la norme?

    Si c'est bien ce que tu dis, j'entends déjà toute une génération de programmeurs (moi compris) dire un grand "oups!"...
    Oups, j'ai dit une bétise. Je corrige.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Algérie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 90
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    ou des catastrophes, c'est selon. Dans mon ex-boite (équipements de réseaux numériques), ce genre de pratique était tout simplement interdite.

    Je me demande si les normes de codage MISRA ne font pas de même.

    Toujours garder en tête que le code doit pouvoir être relu et vérifé de visu par un programmeur lambda (on a pas toujours les moyens de se payer un gourou..)

    Alors le code 'élégant' mais illisible, c'est poubelle directe.
    Faut trouvé un juste compromis, si vraiment ce type de racourcis permet de gagner quelque lignes de code pour quoi pas?
    S'il faut que les autres comprennent sa veut pas dire forcement qu'il faut que tu simplifis au maximum, les autre doivent aussi maitriser un minimum.
    C'est comme si tu demander a un poete du XVIIIeme d'ecire en language star'AC, pour que tout le monde comprennent. Ben non c'est au autres d'elever le niveu.

    sinon plus en rapport avec le C, est-ce qu'il existe un text en français de la norme dont tu parles?

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par disturbedID
    Faut trouvé un juste compromis, si vraiment ce type de racourcis permet de gagner quelque lignes de code pour quoi pas?
    Si le code est garanti sans UB (Undefined Behaviour ou Comportement Indefini) ni dépendant de l'implémentation, OK. Tu en es sûr ? Tu as les connaissances requises pour en juger ? Idem pour les vérifieurs du service de Qualité ?
    sinon plus en rapport avec le C, est-ce qu'il existe un text en français de la norme dont tu parle?
    Non. L'anglais et requis pour faire de l'informatique. Franchement, lire de l'anglais technique, c'est pas méchant. C'est pas du Shakespeare ou du Beckett...

  10. #10
    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,
    Citation Envoyé par disturbedID
    Faut trouvé un juste compromis, si vraiment ce type de racourcis permet de gagner quelque lignes de code pour quoi pas?
    S'il faut que les autres comprennent sa veut pas dire forcement qu'il faut que tu simplifis au maximum, les autre doivent aussi maitriser un minimum.
    C'est comme si tu demander a un poete du XVIIIeme d'ecire en language star'AC, pour que tout le monde comprennent. Ben non c'est au autres d'elever le niveu.
    Sauf qu'au niveau de l'exécutable généré en lui-meme, ce n'est pas le nombre de ligne du code que tu auras écrit qui fera une différence du point de vue de la rapidité d'exécution... Du moins dans l'exemple que tu donnes.

    Si tu es "fade" au point de vouloir éviter l'écriture de quatre lignes, mais que tu préfères perdre 20 minutes dans trois mois pour te relire, honnetement, tu fais un mauvais calcul...

    Je te rappelle que, dés que tu fais une affectation ou une comparaison avec une instruction du coté droit, l'instruction doit etre effectuée avant que l'affectation ou la comparaison ne puisse avoir lieu...

    Un code du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(i==++j)
    {
        //ce qu'il faut faire
    }
    sera exécuté exactement de la meme manière que le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ++j;
    if(i==j)
    {
        //ce qu'il faut faire
    }
    La différence, c'est que dans le premier cas, noyé dans le reste de ton code, tu risque de rater le fait que j est incrémenté avant le test...

    Dans le deuxieme cas, par contre, tu risque beaucoup moins de rater ce fait.

    De la meme manière, les accolades ne sont pas indispensables quand tu n'as qu'une seule instruction à effectuer si un test est vérifié...

    Tu peux donc parfaitement écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(tontest)instruction1;instruction2
    qui aura exactement le meme résultat que si tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(tontest)
    {
        instruction1;
    }
    instruction2;
    Tu gagne quatre lignes de code, mais tu perd énormément en lisibilité.

    Or, s'il y a un principe qu'il faut garder en tete, c'est celui du "on ne peut etre sur de rien"... et meme de ca, on peut en douter ...

    Au moment où tu écris ton code, il te semble parfaitement compréhensible, mais, imaginons, simplement qu'apres l'avoir écrit, tu te casse la jambe en rentrant chez toi, et que tu doives le reprendre trois mois plus tard (apres t'etre fait soigner)...

    Es tu sur que ton code te paraitra aussi limpide? Personnellement, j'ai un doute
    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

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Algérie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 90
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Si le code est garanti sans UB (Undefined Behaviour ou Comportement Indefini) ni dépendant de l'implémentation, OK. Tu en es sûr ? Tu as les connaissances requises pour en juger ? Idem pour les vérifieurs du service de Qualité ?
    Bien sur que je n'est pas les connaissances pour en juger, je n'ai meme pas d'idée concrete pour bien manipuler les "string" mais les phrase du genre il faut eviter tel truc sans comprendre pourquoi, j'aime pas.
    Comprendre un language sur le bout des doigts c'est savoir comment le compilateur reagit a n'importe quel situation.

    Non. L'anglais et requis pour faire de l'informatique. Franchement, lire de l'anglais technique, c'est pas méchant. C'est pas du Shakespeare ou du Beckett...
    justement l'anglais technique c'est lui qui me fait peur, parceque tu ne trouve aucun mot sur "Le petit larousse Anglais-Francais" mais bon... apparament y a pas le choix. t'aurai pas un lien stp?

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Algérie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 90
    Par défaut
    Citation Envoyé par koala01
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(tontest)instruction1;instruction2
    qui aura exactement le meme résultat que si tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(tontest)
    {
        instruction1;
    }
    instruction2;
    Tu gagne quatre lignes de code, mais tu perd énormément en lisibilité.
    .....
    t'exageres un peu la, t'aurais au moins pu mettre la dexieme instruction su une autre ligne mais rajouter des accolades pour une seul instruction n'est pas necessaire donc tu les enleves. faut pas non plus douter de tout comme tu le dis.

  13. #13
    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
    Ceci dit,

    Dans un code du genre de
    Citation Envoyé par Médinoc
    Tu veux dire que le test if(unPointeur==NULL || *unPointeur==0) n'est pas garanti par la norme?
    La partie droite du ou (*unpointeur==0) ne sera effectivement évaluée QUE si la partie gauche ne renvoie pas vrai...

    En effet la table de vérité d'un ou est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    expr1 | expr2 |resultat
    faux  |faux   |faux
    faux  |vrai   |vrai
    vrai  |faux   |vrai
    vrai  |vrai   |vrai
    Si bien qu'en électronique on peut parler de "détecteur de 0" en parlant d'une porte "OR" (la sortie ne vallant 0 que si toutes les entrées sont à 0).

    En effet, dés le moment où l'expression est passée à VRAI, il n'y a plus de raison d'évaluer le reste (car cela ne changera plus: on a quitté l'état unique)

    Par contre, dans un test
    la partie droite de l'opérateur && (i=25) ne sera évaluée que si la partie gauche renvoie déjà vrai, car la table de vérifité de ET représente un état unique lorsque tout est vérifié:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    expr1 | expr2 |resultat
    faux  |faux   |faux
    faux  |vrai   |faux
    vrai  |faux   |faux
    vrai  |vrai   |vrai
    Dans ce cas, dés que le résultat passe à FAUX, il est inutile de continuer à évaluer le reste: le résultat restera FAUX (on a quitté l'état unique)

    Petite astuce: la loi de Morgan s'applique en informatique
    réagit de la meme manière que
    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

  14. #14
    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 disturbedID
    t'exageres un peu la, t'aurais au moins pu mettre la dexieme instruction su une autre ligne mais rajouter des accolades pour une seul instruction n'est pas necessaire donc tu les enleves. faut pas non plus douter de tout comme tu le dis.
    Bien sur que j'ai exagéré...

    Et je vais te faire un avoeux, c'était voulu... Pour la simple et bonne raisonn qu'un exemple pris de manière exagérée sera beaucoup plus percutant qu'un exemple classique... Les gens s'en souviendront bien mieux...

    Quant au fait de douter de tout et de tout le monde, (y compris de soi meme), ca présente l'énorme avantage de t'inciter à etre sur que personne ne pourra faire une betise en utilisant ton application...

    J'ai l'habitude de dire qu'il faut considérer l'utilisateur comme un imbécile distrait, si on veut etre sur qu'il ne provoquera jamais un comportement indéterminé (chaine trop longue, mauvaises valeurs...) Mais le codeur est aussi, d'une certaine manière, un utilisateur... et à ce titre, il a tout autant la possibilité, si pas d'être un imbécile, au moins d'etre distrait
    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

  15. #15
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Franchement, lire de l'anglais technique, c'est pas méchant. C'est pas du Shakespeare ou du Beckett...
    Depuis quand la norme est-elle écrite en anglais? Elle est écrite en "standardese" qui est un language semi-formel basé sur l'anglais. En général, il faut déjà connaître l'ensemble du langage et comment il est décrit pour pouvoir découvrir quelque chose de manière sûre avec les normes des langages (enfin c'est le cas avec les 7 ou 8 que j'ai à un moment donné ou un autre considéré assez bien maîtriser, l'exception étant celle d'Ada83 -- Ada95 c'est à nouveau une autre histoire). En effet, une des caractéristiques de ces oeuvres, c'est que l'absence de répétition sémantique y est élevée en grand art (autrement dit s'il est possible de déduire une proposition P de choses écrites aux pages 12, 56, 78, 145 et 513 par un raisonnement en 42 étapes, P ne sera indiqué nulle part dans la norme, et le raisonnement encore moins. Si on a de la chance, un terme de P permettra de trouver dans l'index les pages 78 et 145, pour les autres, il faut se fier à sa connaissance).

    À noter: il y a des parties des normes qui sont plus facilement compréhensibles et assez exemptes de pièges, la description des bibliothèques en général.

  16. #16
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par disturbedID
    Comprendre un language sur le bout des doigts c'est savoir comment le compilateur reagit a n'importe quel situation.
    Non. On peut connaître en détail comment un compilateur réagit (et même connaître en détail comment tous les compilateurs réagissent), ça ne veut pas plus dire qu'on maîtrise le langage qu'avoir une connaissance parfaite de la chimie permet de dire qu'on maîtrise la biologie. D'ailleurs, il y a bien une période dans tous les langages où même ceux qui l'ont inventé et écrit le premier compilateur ne le maîtrise pas vraiment: ils n'ont pas encore assez d'expérience d'utilisation.

    justement l'anglais technique c'est lui qui me fait peur, parceque tu ne trouve aucun mot sur "Le petit larousse Anglais-Francais" mais bon... apparament y a pas le choix. t'aurai pas un lien stp?
    La page du comité et le document disponible librement le plus proche de la norme (en fait, c'est vraissemblablement le document le plus proche disponible).

  17. #17
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Depuis quand la norme est-elle écrite en anglais?

  18. #18
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par disturbedID
    il faut eviter tel truc sans comprendre pourquoi, j'aime pas.
    Le problème, c'est que pour différentes raisons (les deux principales étant le soucis d'accomoder les implémentations existantes au moment où la norme a été écrite et le soucis de permettre des implémentations performantes), la norme C permet aux implémentations d'avoir des comportements différents. On en trouve même plusieurs classes, du comportement défini par l'implémentation au comportement indéfini en passant par le comportement spécifique à la locale et le comportement non spécifié...

    En particulier, une chose pour laquelle il est laissé de la lattitude à l'implémentation, c'est l'ordre d'évaluation des sous-expressions dans une expression composée. Tant qu'il n'y a pas d'effet de bord, les effets sont mineurs. Quand il y a des effets de bord (avec des fonctions mais aussi, surtout, avec les opérateurs d'incrémentation, de décrémentation et d'assignement), les choses deviennent plus complexe pour savoir ce qui est garanti et à quel moment. On utilise pour cela un modèle avec des points de séquencement auxquels la situation est un peu mieux définie. Mais si en général, les experts sont plus ou moins d'accord sur ce que veut permettre et interdire ce modèle, sa description n'est pas aussi précise que cela et on trouve des trous, des endroits où il interdit des choses qu'on aimerait bien autorisée, des endroits où il permet des choses qu'on aimerait bien interdites.

    L'attitude d'Emmanuel (ne pas utiliser ce qui a des effets de bord en combinaison avec d'autres choses) est un peu extrême mais sensée. Le problème est qu'elle interdit des idiomes courants avec lesquels il faut être famillier même si on ne les emploie pas (while (*p++ != '\0') pour parcourir une chaîne par exemple). Mais il est difficile d'exprimer une règle sans risque plus fine (même si en pratique j'ai tendance à en utiliser une, je ne me risquerai pas à l'exprimer de peur de manquer un cas particulier, comme celui des opérateurs || && par exemple qui introduisent des points de séquencement).

  19. #19
    Membre Expert

    Homme Profil pro
    Inscrit en
    Juillet 2003
    Messages
    2 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 2 075
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Depuis quand la norme est-elle écrite en anglais? Elle est écrite en "standardese" qui est un language semi-formel basé sur l'anglais. En général, il faut déjà connaître l'ensemble du langage et comment il est décrit pour pouvoir découvrir quelque chose de manière sûre avec les normes des langages (enfin c'est le cas avec les 7 ou 8 que j'ai à un moment donné ou un autre considéré assez bien maîtriser, l'exception étant celle d'Ada83 -- Ada95 c'est à nouveau une autre histoire). En effet, une des caractéristiques de ces oeuvres, c'est que l'absence de répétition sémantique y est élevée en grand art (autrement dit s'il est possible de déduire une proposition P de choses écrites aux pages 12, 56, 78, 145 et 513 par un raisonnement en 42 étapes, P ne sera indiqué nulle part dans la norme, et le raisonnement encore moins. Si on a de la chance, un terme de P permettra de trouver dans l'index les pages 78 et 145, pour les autres, il faut se fier à sa connaissance).

    À noter: il y a des parties des normes qui sont plus facilement compréhensibles et assez exemptes de pièges, la description des bibliothèques en général.
    On dirait le tractatus...

  20. #20
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Gnux
    On dirait le tractatus...
    Il ne fait que 70 pages, la norme C en fait plus de 500.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. operateur d'incrementation préfixé
    Par snyfir dans le forum Langage
    Réponses: 6
    Dernier message: 27/09/2009, 12h13
  2. [debutant][DB2] auto increment field
    Par mlequim dans le forum DB2
    Réponses: 4
    Dernier message: 06/10/2006, 16h17
  3. Réponses: 2
    Dernier message: 09/05/2005, 13h08
  4. [debutant]Auto incrementation sur sql-server 2000
    Par syl2095 dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 18/11/2004, 18h00
  5. [Débutant] auto incrémentation (intégré FAQ)
    Par LineLe dans le forum Oracle
    Réponses: 7
    Dernier message: 04/06/2004, 16h35

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