home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 17 / CD_ASCQ_17_101194.iso / dos / prg / alb_c10 / chap_03 / chap_03.txt < prev   
Encoding:
Text File  |  1994-10-03  |  22.5 KB  |  484 lines

  1.  ==========================================================================
  2.                              APPRENTISSAGE du C              version ALB_10                
  3.                              
  4.                          CHAPITRE 3: LES OPERATEURS.
  5.  ==========================================================================
  6.  
  7.  
  8.     Ce sont:            l'opérateur d'affectation (=),  
  9.                         les opérateurs arithmétiques,
  10.                         les opérateurs de manipulation de bits.
  11.                         les opérateurs logiques,
  12.                         et des opérateurs spéciaux.
  13.  
  14.       Le C est très riche en opérateurs. Il utilise ceux des langages évolués 
  15.    mais aussi ceux de l'assembleur pour manipuler des bits.
  16.  
  17.  
  18.  
  19.                         1. L'OPERATEUR D'AFFECTATION (=).         
  20.                         ================================
  21.    
  22.       +----------------------------------------------------------+
  23.       |        Ce n'est surtout pas un symbole d'égalité!        | 
  24.       +----------------------------------------------------------+  
  25.       
  26.         test= 5; signifie que la valeur 5 est affectée à la variable test.
  27.         5= test; est illégal, on n'affecte pas une variable au nombre 5.
  28.  
  29.     =>  Le membre à droite doit être une valeur ou une expression calculée
  30.     =>  Le membre à gauche doit être impérativement un élément modifiable 
  31.         comme par exemple une variable, on dit une "lvalue".  
  32.     
  33.     *  test+ 5= y- 2;  est rejeté, le membre de gauche n'est pas une lvalue
  34.  
  35.     *  x= y= z= 0;  est correct si les variables sont du même type.
  36.        L'associativité se fait de droite à gauche.
  37.  
  38.        Mais on ne peut pas user de cette facilité dans une déclaration:
  39.        double x= y= z= 3;  est rejeté.
  40.  
  41.  
  42.  
  43.                         2. LES OPERATEURS ARITHMETIQUES.
  44.                         ================================
  45.  
  46.      2.1.   Les opérateurs dits "unaires" parce qu'ils 
  47.             n'agissent que sur un seul élément. 
  48.      ---------------------------------------------------------       
  49.     *   + et -  qui déterminent le signe d'une variable: -test;
  50.  
  51.     * les opérateurs d'incrémentation et de décrémentation:
  52.  
  53.                 on incrémente i quand on écrit: i= i+ 1;  
  54.                 on décrémente j               : j= j- 1;
  55.  
  56.       Proche en cela de l'assembleur, le C offre des opérateurs qui 
  57.       permettent d'accélérer ces opérations:
  58.  
  59.                 i++ ou ++i incrémente la variable i de 1.
  60.                 j-- ou --j décrémente j de 1.
  61.   Chapitre 3: Les opérateurs                                        page 1
  62.  
  63.  
  64.  
  65.       =>  A l'intérieur d'un calcul les 2 formes  ne sont pas équivalentes:
  66.  
  67.                 z= 10;          signifie:  test= 10  et  z= 11,
  68.                 test=  z++;     10 est affecté à test puis on incrémente z .
  69.                                 
  70.                 z= 10;          signifie:  test= 11  et  z= 11, 
  71.                 test= ++z;      on incrémente z puis 11 est affecté à test.
  72.                                 
  73.                 z= 10;
  74.                 test= z--;      test= 10  et  z= 9.
  75.  
  76.                 z= 10;
  77.                 test= --z;      test= 9  et  z= 9.
  78.  
  79.       =>  Il est possible d'écrire:       
  80.                                         test= 5+ ++z; 
  81.                                 
  82.       on incrémente z, on l'ajoute à 5 et le résultat est affecté à test.
  83.       L'inconvénient est de rendre le code plus difficile à lire, ne vaut
  84.       il pas mieux écrire sur 2 lignes:
  85.                                         ++z;            // ou: z++;  
  86.                                         test= 5+ z;
  87.  
  88.       =>  On ne peut incrémenter ou décrémenter une expression :
  89.  
  90.                                         ( test* 3/ z)++  est rejeté.
  91.  
  92.       =>  Ces opérateurs ont la plus forte priorité dans les calculs.
  93.  
  94.    2.2. Les opérateurs "binaires", qui portent sur deux termes:  
  95.    -------------------------------------------------------------
  96.  
  97.    *            + l'addition, - la soustraction, 
  98.                 * la multiplication, / la division.
  99.  
  100.    *  On ajoute les opérateurs parenthèses () pour fixer l'ordre des calculs.
  101.    
  102.    * L'opérateur modulo, noté %, qui donne le reste de la division entière 
  103.      d'un entier par un autre:  25 % 5= 0,   25 % 7= 4,   25 % 19= 6.
  104.  
  105.    * Les opérateurs raccourcis. Ils sont utilisés à cause de leur rapidité.
  106.  
  107.         test= test+ z;  s'écrit en raccourcis:  test+= z;
  108.  
  109.      Dans le premier cas, le C réserve une place en mémoire pour conserver
  110.      la variable test qui doit être conservée, alors qu'avec l'écriture 
  111.      raccourcie l'opération se fait dans le registre qui contient test dont
  112.      on ne conservera pas l'ancienne valeur.
  113.      On a selon le même principe:
  114.  
  115.         x+= y;  <=>   x= x+ y;        x-= y;  <=>   x= x- y;                                                                     
  116.         
  117.         x*= y;  <=>   x= x* y;        x/= y;  <=>   x= x/ y;
  118.  
  119.                         x%= y;  <=>   x= x% y;
  120.  
  121. => Comme avec l'opérateur d'affectation, le membre à gauche doit être 
  122.     impérativement une "lvalue", un élément modifiable, et le membre à 
  123.     droite doit être une expression calculée ou une valeur.
  124.   Chapitre 3: Les opérateurs                                        page 2
  125.  
  126.  
  127.  
  128.                 3. LES OPERATEURS DE MANIPULATION DE BITS.
  129.                 ==========================================
  130.  
  131.       Ils agissent directement sur le code binaire des mots machine, ce 
  132.    qui accélère les opérations simples. On qualifie ces opérations de 
  133.    "bas niveau". Ces opérateurs ne s'appliquent qu'à des variables de type 
  134.     entier ou assimilé: int, char, short, long int, signés ou non.
  135.  
  136.    3.1. L'opérateur unaire d'inversion bit à bit.    symbole: ~  ( Alt 126)
  137.    ----------------------------------------------
  138.        Il inverse un à un tous les bits d'un mot:
  139.  
  140.                         0111 1111 1111 1110     <=>     32766
  141.              ~32566 =>  1000 0000 0000 0001     <=>   - 32767    
  142.              
  143.       C'est à 1 près la valeur inverse en décimal.
  144.  
  145.                                                                 
  146.    3.2.  Opérateur logiques binaires bit à bit. (  & , | , ^ )    
  147.    ---------------------------------------------                
  148.         Ils s'appliquent à des valeurs entières:     symbole
  149.  
  150.                 ET logique bit à bit:                   &
  151.                 OU logique bit à bit:                   |        ( Alt 124)   
  152.                 OU logique exclusif bit à bit:          ^
  153.                 
  154.         +---------------------------------------------------------+
  155.         |        X       Y       X & Y       X | Y       X ^Y     |
  156.         +---------------------------------------------------------+
  157.         |        0       0         0           0          0       |
  158.         |        1       0         0           1          1       |
  159.         |        0       1         0           1          1       |
  160.         |        1       1         1           0          1       |
  161.         +---------------------------------------------------------+
  162.  
  163.       exemples:     X     0000 1111 0000 1111     <=>      3855
  164.                     Y     0001 0000 1111 1001     <=>      4345
  165.                   X & Y   0000 0000 0000 1001     <=>         9
  166.  
  167.                     X     0000 1111 0000 1111     <=>      3855
  168.                     Y     0001 0000 1111 1001     <=>      4345
  169.                   X | Y   0001 1111 1111 1111     <=>      8191
  170.  
  171.                     X     0000 1111 0000 1111     <=>      3855
  172.                     Y     0001 0000 1111 1001     <=>      4345
  173.                   X ^ Y   0001 1111 1111 0110     <=>      8182
  174.   Chapitre 3: Les opérateurs                                        page 3
  175.  
  176.  
  177.  
  178.    3.3.  Les opérateurs de décalage binaire vers la droite et vers la gauche.       
  179.    --------------------------------------------------------------------------
  180.  
  181.    Ils permettent des opérations sur des entiers,
  182.    les bits sortants sont perdus,
  183.    les bits entrants sont des 0.
  184.  
  185.    *  Décalage à gauche:  x << y 
  186.       4345 << 2     la valeur binaire de 4345 est décalée 2 fois à gauche.
  187.       C'est la multiplication par 2 autant de fois qu'il y a de décalages,
  188.       mais à l'intérieur du domaine de définition des variables.
  189.  
  190.            Voici 3 exemples où on utilise des int de 16 bits:
  191.  
  192.                           0001 0000 1111 1001     <=>      4345 
  193.            4345 << 2      0100 0011 1110 0100     <=>     17380 = 4* 4345
  194.                                                                   2 décalages
  195.                           1100 0010 0111 0100     <=>    -15756
  196.          -15756 << 1      1000 0100 1110 1000     <=>    -31512 = 2* (-15756)
  197.                                                                   1 décalage
  198.                           1101 1111 1100 0110     <=>     -8250
  199.           -8250 << 2      0111 1111 0001 1000     <=>     32536
  200.                           
  201.       on est sorti du domaine des int: 32536= 32768 + ( -8250* 4+ 32768)
  202.                                             = limite+ dépassement algébrique
  203.  
  204.  
  205.                                                                 ************
  206.    *  Décalage à droite:   x >> y                    Analysez:    CH03_01.C
  207.      On divise par 2 à chaque décalage.                         ************
  208.         
  209.                           0001 0000 1111 1001     <=>      4345 
  210.              4345>>2      0000 0100 0011 1110     <=>      1086= 4345/ 4
  211.  
  212.   Pour ces opérateurs binaires on dispose d'expressions raccourcies:
  213.  
  214.       x&= y <=> x= x& y      x^= y <=> x= x^ y      x>>= y <=> x= x>> y 
  215.       
  216.       x|= y <=> x= x| y                             x<<= y <=> x= x<< y 
  217.   Chapitre 3: Les opérateurs                                        page 4
  218.  
  219.  
  220.  
  221.                         4. LES OPERATEURS LOGIQUES.                     
  222.                         ===========================
  223.  
  224.    Ils font des comparaisons ou des opérations logiques sur des variables 
  225.    en utilisant une convention: 
  226.    
  227.         si la réponse à la question posée est: 
  228.         
  229.                 "FAUX" l'opérateur renvoie 0
  230.                 "VRAI" l'opérateur renvoie une valeur différente de 0.
  231.  
  232.    4.1. Les opérateurs de comparaison.  ( <, >, <=, >=, !=, == )
  233.    -----------------------------------
  234.  
  235.    x= 3      y= 0            x < y   renvoie 0       x > y  renvoie 1
  236.                              x <= y          0       x >= y         1
  237.                                                                 
  238.    != est le test "différent de":    x != y  renvoie 1            
  239.                                                                 
  240.    == est le test d'égalité     :    x == y  renvoie 0
  241.       Il ne faut surtout pas le confondre avec l'opérateur d'affectation (=),
  242.       
  243.    4.2. Les opérateurs logiques.   ( && , || , ! )                
  244.    -----------------------------                                
  245.                                                                 ************
  246.         NON                   !                       analysez:   CH03_02.C
  247.         ET                    &&      Intersection              ************
  248.         OU inclusif           ||      Union   
  249.                 
  250.         +---------------------------------------------------------+
  251.         |        x       y       x && y      x || y       !x      |
  252.         +---------------------------------------------------------+
  253.         |        0       0         0           0          1       |
  254.         |        1       0         0           1          0       |
  255.         |        0       1         0           1                  |
  256.         |        1       1         1           0                  |
  257.         +---------------------------------------------------------+
  258.  
  259.         Il ne faut pas les confondre avec les opérateurs binaires:  &, |, ^, 
  260.         qui ne portent que sur des entiers.
  261.  
  262.    => Dans le programme CH03_02.C notez plus particulièrement:
  263.  
  264.       si t0= 0 , !t0= 1      si= t2= 3 , !t2= 0
  265.                                                                 ************
  266.    => Décortiquez le programme CH03_03.C .                        CH03_03.C
  267.                                                                 ************
  268.       Son prétexte est une vérification des lois de Morgan,     
  269.       classiques en algèbre de Boole.
  270.       Notez qu'il y a un ordre de priorité entre ces opérateurs: 
  271.       ! possède une priorité supérieure à && et && à ||. Dans le calcul de 
  272.       test1 la machine évalue d'abord !( t0< t1) et !( t1< t2) puis fait 
  273.       l'opération &&.
  274.       Vous trouverez plus loin une rubrique qui précise ces priorités.
  275.   Chapitre 3: Les opérateurs                                        page 5
  276.  
  277.  
  278.  
  279.                         5. LES OPERATEURS SPECIAUX.
  280.                         ===========================
  281.  
  282.    Nous étudierons: 
  283.         l'opérateur ternaire (?),
  284.         l'opérateur séquentiel (,),
  285.         l'opérateur de conversion de type (),
  286.         l'opérateur sizeof(),
  287.         les opérateurs unaires de référence et de déréférencement.
  288.  
  289.    5.1. L'opérateur ternaire conditionnel (?).
  290.    -------------------------------------------
  291.  
  292.          C ? A : B    ternaire puisque nous avons 3 expressions C, A, B.
  293.  
  294.    1° Il teste l'expression C.
  295.    2° Si cette expression est "VRAI", il évalue A et renvoie sa valeur.
  296.       Si cette expression est "FAUX", il évalue B et renvoie sa valeur.
  297.      
  298.                                                                 ************
  299.                                                      analysez:   CH03_04.C
  300.                                                                 ************
  301.      Remplacez dans la déclaration float par double et les %f par %lf dans
  302.      les quatres printf(). L'erreur d'arrondi disparait.
  303.  
  304.    5.2. L'opérateur séquentiel (,).
  305.    --------------------------------
  306.    Il permet d'enchaîner plusieurs instructions, la dernière donne sa valeur 
  307.    à l'expression. On l'utilise par exemple pour:
  308.  
  309.        *  Des déclarations multiples:  double x, y= 2.36e-5, z;
  310.  
  311.        *  Dans la partie initialisation et celle de fin de la boucle "for"
  312.         comme nous le verrons plus loin.
  313.        
  314.        *  Dans des calculs:                                     ************
  315.                         il est à employer sans excès, analysez:   CH03_05.C
  316.                                                                 ************
  317.  
  318.    5.3. L'opérateur de conversion de type ().       ( ou opérateur de cast)
  319.    ------------------------------------------
  320.    *   Cet opérateur nous est familier en mathématiques où il permet de 
  321.    contrôler l'ordre des opérations dans un calcul: ( x- y)/ 1.3-( y- 1)* 4
  322.  
  323.    *   En C c'est aussi un opérateur qui permet de forcer la conversion 
  324.    d'un type de variable en un autre type.
  325.  
  326.            ( nouveau type qu'on force) expression à convertir   
  327.            
  328.         par exemple:             (int) z      z étant double.
  329.  
  330.         Je cherche à obtenir la valeur entière d'une expression z:
  331.         double x= 1.3e-4, y= 25.3, z;
  332.         int a;
  333.         z= ( x- 3.5)/ ( 7* y+ 5.1)+ 18;      // z= 17.980791
  334.         a= (int) z;                          // a= 17
  335.  
  336.       On a forcé la variable double z, à se convertir en un entier.
  337.   Chapitre 3: Les opérateurs                                        page 6
  338.  
  339.  
  340.  
  341.       ATTENTION, cette opération présente des dangers           ************=
  342.    quand on sort du domaine de définition des variables:          CH03_06.C
  343.    Dans ce programme on passe aux long int pour pallier cet     ************=
  344.    inconvénient.
  345.       Notez que l'opération de conversion ne se fait qu'après le calcul de
  346.    l'expression. Celui ci se fait dans les conditions normales:
  347.  
  348.                 a= (int) ( ( x- 3.5)/ ( 7* y+ 5.1)+ 18 );
  349.  
  350.    5.4. L'opérateur sizeof().
  351.    -------------------------
  352.       Il permet de calculer la taille en octets d'une variable et donc de 
  353.    son type.
  354.                            sizeof( nom de la variable)
  355.         int a= 25;
  356.         printf(" taille de la variable a= %d", sizeof( a));
  357.  
  358.    Nous obtiendrons: taille de la variable a= 2
  359.    L'écriture sizeof( int) aurait donné 2
  360.               sizeof( double) aurait donné 4
  361.  
  362.    5.5. Les opérateurs unaires d'adresse et d'indirection & et *  .
  363.    ----------------------------------------------------------------
  364.       Nous avons vu qu'au moment de la déclaration d'une variable, le 
  365.    compilateur réserve un espace mémoire pour stocker la valeur qui sera 
  366.    ensuite affectée à cette variable quand on l'initialise. Le compilateur
  367.    conserve dans une table le nom de la variable avec l'adresse de cette zone.
  368.  
  369.      *  L'opérateur unaire d'adresse ( ou de référencement) & permet 
  370.         d'obtenir cette adresse( ou cette référence). On utilise le même 
  371.         symbole que celui du ET bit à bit qui est un opérateur binaire. 
  372.         Cet opérateur s'applique à une variable:
  373.  
  374.                 Si a est une variable, &a est une adresse, la référence de a.
  375.  
  376.      *  Inversement, on peut obtenir la valeur stockée à l'adresse indiquée,
  377.         avec l'opérateur unaire d'indirection ( ou de déréférencement) qui 
  378.         utilise le même symbole * que l'opérateur binaire de multiplication.
  379.         Cet opérateur s'applique à une adresse:
  380.  
  381.                 Si &a est une adresse, *(&a) est la valeur 
  382.                 de la variable située à cette adresse, donc a.
  383.                                                                 ************
  384.                                             Analysez:             CH03_07.C
  385.                                                                 ************
  386.         C'est une application directe des définitions précédentes.
  387.   Chapitre 3: Les opérateurs                                        page 7
  388.  
  389.  
  390.                                                                 ************
  391.                                             Analysez:             CH03_08.C
  392.                                                                 ************
  393.    Ce programme est presque identique au précédent. Une ligne est ajoutée, et
  394.    c'est capital: 
  395.                    *(&a)= 32;   ce qui a entraîné a= 32
  396.                                 
  397.    L'adresse déréférencée a été modifiée. La variable a suivi. C'est lourd de
  398.    conséquences pour l'évolution du langage. Une variable a été modifiée
  399.    indirectement à partir de son adresse. Les développeurs du langage, pour 
  400.    généraliser ce comportement ont créé une nouvelle catégorie d'objets qui 
  401.    sont par leur nature des adresses. 
  402.    
  403.    Si un de ces nouveaux objets est une variable b, sa valeur est donc
  404.    une adresse. Si nous affectons à b l'adresse de la variable a, b= &a;
  405.    Alors *b, la valeur déréférencée de b, est égale à la valeur de a.
  406.    Si nous modifions *b, alors la variable a sera modifiée.
  407.  
  408.    On appelle l'objet *b, valeur déréférencée de la variable adresse b, un  
  409.    POINTEUR car il semble qu'il montre, qu'il pointe la variable a.
  410.  
  411.                                                                 ************
  412.                                             Analysez:             CH03_09.C
  413.                                                                 ************
  414.       ------------------------------------------------------------
  415.       |  *b étant déclaré,        si:  b= &a;    alors:  *b= a;  | 
  416.       ------------------------------------------------------------
  417.   Chapitre 3: Les opérateurs                                        page 8
  418.  
  419.  
  420.  
  421.  
  422.  6. ORDRE DE PRIORITE DES OPERATEURS EN C.
  423.  =========================================------------------------------
  424.  
  425.     ( )       appel de fonction                          gauche à droite
  426.     [ ]       élément de tableau
  427.      .        membre d'une structure ou d'une union
  428.     ->        pointeur sur un membre
  429.   sizeof      taille d'un objet en bytes
  430.   sizeof      taille d'un type en bytes
  431.  -----------------------------------------------------------------------
  432.     ++        post incrémentation (lvalue++)             droite à gauche
  433.     ++        pre incrémentation (++lvalue)
  434.     --        post décrémentation (lvalue--)
  435.     --        pre décrémentation (--lvalue)
  436.      ~        inversion de bits
  437.      !        non logique
  438.      -        moins unaire
  439.      +        plus unaire
  440.      &        addresse 
  441.      *        indirection
  442.   (type)      conversion de type
  443.  ----------------------------------------------------------------------
  444.      *        multiplication                            gauche à droite
  445.      /        division
  446.      %        modulo
  447.  ----------------------------------------------------------------------
  448.      +        addition                                  gauche à droite
  449.      -        soustraction
  450.  ----------------------------------------------------------------------
  451.     <<        décalage à gauche                         gauche à droite
  452.     >>        décalage à droite
  453.  ----------------------------------------------------------------------
  454.      <        plus petit que                            gauche à droite
  455.     <=        plus petit ou égal
  456.      >        plus grand que
  457.     >=        plus grand ou égal
  458.  ----------------------------------------------------------------------
  459.     ==        égalité                                   gauche à droite
  460.     !=        inégalité
  461.  ----------------------------------------------------------------------
  462.      &        ET logique bit à bit                      gauche à droite
  463.  ----------------------------------------------------------------------
  464.      ^        OU logique exclusif bit à bit             gauche à droite
  465.  ----------------------------------------------------------------------
  466.      |        OU logique bit à bit                      gauche à droite
  467.  ----------------------------------------------------------------------
  468.     &&        ET logique                                gauche à droite
  469.  ----------------------------------------------------------------------
  470.     ||        OU inclusif                               gauche à droite
  471.  ----------------------------------------------------------------------
  472.    ?  :       opérateur ternaire                        droite à gauche
  473.  ----------------------------------------------------------------------
  474.      =        affectation                               droite à gauche
  475.               et aussi   +=    -=    *=    /=    %=
  476.                          &=    ^=    |=   >>=   <<=
  477.  ----------------------------------------------------------------------
  478.      ,        opérateur séquentiel                      gauche à droite
  479.  ----------------------------------------------------------------------
  480.   Fin du chapitre 3: Les opérateurs                                 page 9
  481.  
  482.  
  483.  
  484.