Maëlan

« La notion de passoire est indépendante de la notion de trou, et réciproquement. »

À propos de Maëlan

Date de naissance : 29 février

Envoyer un message

Biographie

Voir aussi les bios de realmagma et poupou9779.




La minute de C
Pour se coucher moins bête le soir



Les brouillons les plus à jour de la norme C sont disponibles au format PDF sur le site Open Standards : C99, C11.



1) Les opérateurs du C, leur priorité et leur associativité

Maintenant intégré dans la FAQ, en mieux (le tableau des opérateurs est lisible sans bogue bizarre de mise en forme sur ma page de PdP).



2) Les opérateurs d'incrémentation et de décrémentation : ++ et --



3) L'opérateur virgule : ,

Pas encore rédigé.



4) L'évaluation en « court-circuit »

Pour la suite, je considère que vous connaissez les opérateurs bit-à-bit (bitwise, en anglais) &, | et ^ et logiques && et ||, et que vous savez la différence entre les deux.

Pour présenter l’évaluation en « court-circuit », un exemple :
if(p!=NULL && p->member==42)   {/*…*/}

Ici, on vérifie que le pointeur p n’est pas nul avant d’accéder à un membre de la structure sur laquelle il pointe.
Mais, me direz-vous ! (Enfin, j’espère que vous le direz, sinon vous risquez de vous noyer dans un océan de bogues incompréhensibles) Si p==NULL, l’expression de droite (p->member==42) est quand même évaluée, et on aura droit à une belle erreur de segmentation !

Eh bien non ! Car en C comme dans d’autres langages, l’évaluation des opérateurs logiques suit un mécanisme dit de « court-circuit ». Cela signifie que…
Pour le ET logique : lorsque vous faites A && B, B ne sera pas évalué si A est faux (c’est-à-dire s’il vaut 0) : ce n’est pas nécessaire pour connaître la valeur de l’expression entière, qui sera forcément fausse (du fait de la définition du ET logique).
De même pour le OU logique : dans l’expression A || B, B ne sera pas évalué si A est vrai, car le tout sera forcément vrai.
Enfin, on peut dire que l’opérateur ternaire ?: a aussi un comportement de court circuit : dans (condition) ? X : Y, seule une des deux expressions (X ou Y) sera évaluée/exécutée, en fonction du résultat de la condition (X si la condition est vraie, Y si elle est fausse).

L’évaluation en court-circuit a 2 intérêts :
  • Vous pouvez mettre comme 1ère opérande de && ou || une condition sans laquelle l’évaluation de la 2è opérande provoquerait une erreur, comme dans l’exemple ci-dessus ou celui-ci (honteusement pompé de ) :
    for(i=0; i<n && tab[i]>val; i++) {
       /* on parcourt le tableau tab de taille n en comparant tab[i] à val */ }
    
    Sans le comportement en court-circuit, lorsqu’on arrive à i==n, alors dans la 2è opérande du &&, on accéderait à tab[n], ce qui nous vaudrait une erreur de segmentation (le dernier indice du tableau étant n-1)…
  • Dans certains cas, optimiser son programme. En effet, le comportement de court-circuit n’accélère pas l’exécution de A && B, par rapport au cas où ce comportement serait absent, si A et B sont de simples variables booléennes. Ce serait même le contraire, car le court-circuit impose d’évaluer A puis B successivement, alors que sans ce fonctionnement A et B seraient évalués simultanément (au mieux, les deux sont aussi rapides).
    Cependant, dans le cas de calculs plus complexes (dont des appels de fonctions), vous pouvez potentiellement économiser un calcul coûteux, s’il est en 2èopérande de && ou ||. Par exemple, j’avais écrit une fonction permettant de vérifier une longue série de relations mathématiques, et qui retourne un booléen indiquant si ces relations sont respectées :
    int check(void) {
       /* a, b, c, A, B, C, P et S sont des variables (globales) de type double,
          donc tous ces calculs sont très coûteux (surtout ceux avec sin et cos) */
       return (A+B+C == M_PI)           // 1) À noter que j’ai mis les calculs les plus simples …
           && (a+b+c == P)              //…   en premiers.
           && (2*S == a*b*sin(C))
           && (2*S == a*c*sin(B))       // 2) Grâce au court-circuit, la série de calculs …
           && (2*S == b*c*sin(A))       //…   s’arrête dès qu’une relation n’est pas respectée.
           && (a*a == b*b + c*c - 2*b*c*cos(A))
           /*...*/                      // 3) Si toutes les relations sont justes, alors …
           && (sin(A)/a == sin(B)/b) ;  //…   le programme fait tous les calculs jusqu’à la fin.
    }
    


Cependant, cet aspect peut être une source de problèmes si on l’oublie où qu’on ne le connaît pas. En effet, dans le code suivant (si f et g sont deux fonctions) :
if(f() && g())   {/*…*/}
Si f retourne 0, alors g ne sera même pas exécutée ! C'est fâcheux si g fait autre chose que retourner une valeur, c’est-à-dire si elle a un « effet de bord » : modifier une variable, écrire dans un fichier ou sur l’écran… Si l’on se base ensuite sur les effets de bord de g, on risque de mauvaises surprises.


Une petite citation de la norme pour finir :

Citation : norme ISO/IEC 9899 (C99) − 6.5.13 - Logical AND operator

Unlike the bitwise binary & operator, the && operator guarantees left-to-right evaluation; there is a sequence point after the evaluation of the first operand. If the first operand compares equal to 0, the second operand is not evaluated.


Citation : norme ISO/IEC 9899 (C99) − 6.5.14 - Logical OR operator

Unlike the bitwise | operator, the || operator guarantees left-to-right evaluation; there is a sequence point after the evaluation of the first operand. If the first operand compares unequal to 0, the second operand is not evaluated.


Citation : norme ISO/IEC 9899 (C99) − 6.5.15 - Conditional operator

The first operand is evaluated; there is a sequence point after its evaluation. The second operand is evaluated only if the first compares unequal to 0; the third operand is evaluated only if the first compares equal to 0;



5) Les champs de bits





Mon avatar à moi
Merci.

Avatar labyrintheCertaines personnes aux goût douteux semblent apprécier mon avatar. Quelques-unes ont même essayé de l’utiliser à leur compte. L’histoire ne dit pas ce qui leur est arrivé. Non. Je veux pas. C’est mon avatar. Je peux le prouver. Ce n’est pas une image qui circule sur les Internets, je l’ai créé de mes mains dans ce seul but, avec amour et Paint. Vous voilà prévenu.
Une discussion par MP (authentique) à laquelle j’ai eu droit :

titre du MP : « algo »

Scientifik42

slt

c koa lalgo sr ton avatar ????


Tu me don le cod pr le refèr ????

mersi
Scientifik42

Maëlan

slt

c hyper facil regarde tout es expliquer la: http://animation.yihui.name/mvstat:k-m [...] ter_algorithm

(pour le retrouvé c la http://www.google.fr/search?q=cod%20algo%20img%20anim )

Scientifik42

xd


t 1 komik toi

gèm bi1 ton umour mé c koa en vré ???

(Le lien est mort, c’était un article matheux en anglais sur la génération de labyrinthes.) Bluffait-il ? le mystère reste entier.








                       ___________
  
                  ╱                          ╲
    
             ╱     ⌁                        ╲
      
        ╱ ⏠                           ⏠ ╲
      
       ⎟╱_____              _____╲⎜
       
     ⎛╱          `———⎖          ╲⎞
      
      ╱ ⟨___⋰               ⋱___⟩ ╲
    
    ╱       _               ⣤             _       ╲
     
∠-–——╲        ⠼⣿⣧       ╱ –––––╲
      
             ╱  ╲ ⠼⣿⣿⣿⣧ ╱  ╲
          
                  ⎺         ⎺

Signature

⅋⅌℘ 😸 ۩ ⚑✈

Information sur le compte

Date d'inscription : 22 avril 2010

Dernière connexion : 6 juillet 2016