C für PICs: Operationen
        
      
    
    
    zurück
        zu C für PICs , C-Compiler , PIC-Prozessoren , Elektronik , Homepage
    
    C für PICs
      
      Grundlagen von C
      Variablen
          Funktionen
          Operationen
        Programmablaufsteuerung
      Arrays und Strings
      Pointer
      Strukturierte Typen
        PIC-spezifisches
    
    
        zurück zu C für PICs 
    
    
    Operationen
    
    
    In hohen Programmiersprachen sind Ausdrücke wichtig. Ein Ausdruck
    ist eine Kombination von Operanden (Zahlen, Variablen, Konstanten)
    und
    Operatoren (plus, minus, geteilt-durch, mal ...). Ein Ausdruck hat
    einen Wert, der ist das Ergebnis der Verknüpfung von Operanden und
    Operatoren. Der Wert eines Ausdrucks lässt sich einer Variable
    zuweisen 
    
    Variable = Ausdruck;
    
    
    oder zur Programmablaufsteuerung auswerten.
    
    falls (ausdruck
        < bestimmter_wert) dann mach folgendes ...
    
    
    Beispiel 1:
    8 / 4 + 25
    
    Dieser Ausdruck verknüpft Zahlen (also Konstanten) mit einer
    Division und einer Addition. Er hat den Wert 27, wie man leicht
    errechnen kann.
    
    Beispiel 2:
    8 / alfa + 25
    
    Dieser Ausdruck verknüpft Zahlen (also Konstanten) sowie eine
    Variable mit einer Division und einer Addition. Sein Wert hängt
    davon ab, welchen Wert alfa momentan
    hat.
    
    Den Wert eines Ausdrucks kann man in einer Variable speichern. Diese
    muss natürlich einen geeigneten Typ haben. Die Wertzuweisung auf
    diese Variable erfolgt mit dem "=" Operator. So eine Wertzuweisung
    ist
    eine Anweisung und muss mit einem Semikolon abgeschlossen werden.
    
    int ergebnis;
      ergebnis
        = 8 /
        2 + 25;
        
        int alfa;
        alfa = 4;
        ergebnis = 8 / alfa + 25;
      
    
    
    
    
Arithmetische
      Operationen
    
    Es gibt fünf grundlegende arithmetische Operationen in C.
    
    
      
        
          Symbol 
           | 
          Operation 
           | 
        
        
          + 
           | 
          Addition 
           | 
        
        
          - 
           | 
          Subtraktion 
           | 
        
        
          * 
           | 
          Multiplikation 
           | 
        
        
          / 
           | 
          Division 
           | 
        
        
          % 
           | 
          Modulo 
           | 
        
      
    
    
    Die ersten vier Operationen sollte noch jeder kennen. Die letzte
    (Modulo) ermittelt den verbleibenden Rest bei einer
    Ganzzahldivision.
    
    Beispiel:
    Der Wert 5 sei ganzzahlig durch den Wert 3 zu teilen. Das Ergebnis
    ist
    1 und der Rest der Division ist 2. (5 = 1*3 + 2)
    Die 2 ist das Ergebnis der Modulo-Funktion. Notiert wird das als
    Ausdruck dann wie folgt:
    5 % 3
    
    
    Dieser Ausdruck hat den Wert 2.
    
    int alfa;
      alfa = 5
        % 3;
    
    
    Die arithmetischen Operationen lassen sich in Ausdrücken beliebig
    kombinieren. Dabei gilt : Punktrechnung kommt vor Strichrechnung. Um
    die Reihenfolge der Operationen in komplizierten Ausdrücken zu
    steuern, kann man runde Klammern einsetzen.
    
    
    Relationale
        Operationen
    
    Relationale Operatoren sind Vergleichsoperatoren. Ein relationaler
    Operator vergleicht den Wert zweier Ausdrücke. Das Ergebnis ist
    entweder true (richtig)
    oder false (falsch).
    
    Es gibt sechs grundlegende relationale Operationen in C.
    
    
      
        
          Symbol 
           | 
          Operation 
           | 
        
        
          | >  | 
          größer 
           | 
        
        
          >= 
           | 
          größer
            oder gleich 
           | 
        
        
          < 
           | 
          kleiner 
           | 
        
        
          <= 
           | 
          kleiner
            oder
            gleich 
           | 
        
        
          == 
           | 
          gleich 
           | 
        
        
          != 
           | 
          ungleich 
           | 
        
      
    
    
    Als Ergebnis eines Vergleiches liefert C entweder 0 (für false) oder 1 (für true). In C hat false immer den Wert 0. Alle
    anderen Werte - also auch die 1 - stehen für true. 
    Im Prinzip stellt eine relationale Operation eine Behauptung dar,
    die
    entweder wahr (1) oder falsch (0) ist. Sie ist deshalb ein Ausdruck
    mit
    dem Wert 1 oder 0.
    
    Beispiel:
    Der folgend Ausdruck liefert nur 1 (true, wahr), wenn alfa wirklich
    größer als 10 ist. In allen anderen Fällen liefert er 0
    (falsch , false)
    alfa > 10
    
    
    Der folgend Ausdruck liefert nur 1, wenn alfa genau 10 ist. In allen
    anderen Fällen liefert er 0
    alfa == 10
    
    
    Der Wert von alfa ist 5. Die "Behauptung "alfa>10" ist also
    falsch.
    Deshalb ergibt die Vergleichsoperation false
    und liefert den Wert 0. Dieser Wert wird dann in beta abgespeichert.
    int alfa, beta;
        alfa = 5;
        beta = alfa > 10;
        
      
    In kann man das Ergebnis eines Vergleichsoperation auch als Operator
    einer arithmetischen Operation verwenden. Im folgenden Beispiel wird
    beta mit 11 beschrieben.
    int alfa, beta;
      alfa = 5;
      beta = 10
        +
        (alfa < 10);
      
    
    
    
    Logische
      Operationen
    
    Die logische Operatoren sind die boolschen Operatoren UND, ODER und
    NICHT. Sie verknüpfen die boolschen Werte true und false und
    liefern als Ergebnis
    wieder einen boolschen Wert true oder
    false. Wer mit digitalen
    Schaltkkreisen (z.B. TTL-Schaltkreisen der Serien 74xx) gebastelt
    hat,
    erkennt unschwer die in Software gegossenen UND-, ODER und
    INVERTER-Gatter wieder. Die ODER-Funktion ist ein sogenanntes
    inklusives ODER. Ein exklusives ODER (XOR) gehört nicht zur
    C-Grundausstattung.
    
    Die Schreibweise von UND und ODER sind ein doppeltes "&" bzw. ein doppelter
    senkrechter Strich. Hier ist beim Schreiben Sorgfalt geboten, denn
    es
    gibt das "&"-Symbol
    und den senkrechten Strich auch in einfacher Ausführung, nur
    stehen diese für bitweise Operationen
    (siehe unten) und liefern ganz andere Ergebnisse. Die NICHT-Funktion
    ist ein einzelnes dem Operator vorangestelltes Ausrufezeichen. (Der
    sieht leider einem senkrechten Strich verdammt ähnlich. Also
    aufpassen !)
    
    
      
        
          Symbol 
           | 
          Operation 
           | 
        
        
          | &&  | 
          UND 
             | 
        
        
          || 
             | 
          ODER 
             | 
        
        
          ! 
             | 
          NICHT 
             | 
        
      
    
    
    
    Da in C  false und true durch die Zahlen 0 und 1
    repräsentiert werden, lässt sich die Wahrheitstabelle der
    logischen Operatoren  wie folgt schreiben:
    
    
      
        
          a 
           | 
          b 
           | 
          a
            && b 
           | 
          a
            || b 
           | 
          !a 
           | 
        
        
          | 0  | 
          0 
           | 
          0 
           | 
          0 
           | 
          1 
           | 
        
        
          1 
           | 
          0 
           | 
          0 
           | 
          1 
           | 
          0 
           | 
        
        
          0 
           | 
          1 
           | 
          0 
           | 
          1 
           | 
          1 
           | 
        
        
          1 
           | 
          1 
           | 
          1 
           | 
          1 
           | 
          0 
           | 
        
      
    
    
    Logische Operationen werden oft dazu benutzt, die Ergebnisse relationaler Operationen zu verknüpfen.
    
    
    Eine weitere typische Anwendung logischer Operationen sind Programmsteueranweisungen, die aber
    erst später behandelt werden.
    
    
    
    
    Bitweise
      Operationen
    
    Meistens werden die einzelnen Bits einer Char- oder Integervariablen
    nicht einzeln betrachtet, denn erst zusammen ergeben sie einen Sinn:
    den Wert der Variablen. Manchmal ist es aber auch nützlich mit den
    einzelnen Bits zu arbeiten. Dazu dienen die bitweisen Operationen.
    
    Es gibt sechs grundlegende bitweise Operationen in C. Sie
    verknüpfen die individuellen Bits an identischen Positionen zweier Operanden oder
    verschieben die Bits innerhalb eines Operanden. Das
    Ergebnis ist ein Operand des Eingangstyps (Char oder Integer):
    
    
      
        
          Symbol 
           | 
          Operation 
           | 
        
        
          | &  | 
          bitweises
            UND 
           | 
        
        
          | |  | 
          bitweises
            ODER 
           | 
        
        
          ^ 
           | 
          bitweises
            Exklusiv-ODER 
           | 
        
        
          ~ 
           | 
          Einerkomplement 
           | 
        
        
          >> 
           | 
          bitweises
            Verschieben nach rechts 
           | 
        
        
          << 
           | 
          bitweises
            Verschieben nach links | 
        
      
    
    
    Beispiel 1:
    
    char alfa, beta, U,
        O, E;
      alfa = 5;
      beta = 6;
      U = alfa
        &
        beta;
      O = alfa
        |
        beta;
      E = alfa
        ^
        beta;
      
    
    
    
      
        
          alfa 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          1 
           | 
          0 
           | 
          1 
           | 
        
        
          beta 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          1 
           | 
          1 
           | 
          0 
           | 
        
        
          U 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          1 
           | 
          0 
           | 
          0 
           | 
        
        
          O 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          1 
           | 
          1 
           | 
          1 
           | 
        
        
          E 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          1 
           | 
          1 
           | 
        
      
    
    
    Das Beispiel zeigt die bitweise Verknüpfung zweier 8-Bit-Werte. Im
    Ergebnis haben die Variablen U, O und E die Werte 4, 7 und 3.
    
    
    
    Bei Verschiebeoperationen werden die Bits innerhalb der Variable um
    eine bestimmte Anzahl von Stellen verschoben. Dabei werden an einem
    Ende der Variablen Bits "hinausgeschoben" (die damit verloren sind)
    und
    am anderen Ende Nullen hineingeschoben. Eine Rechtsverschiebung um
    eine
    Stelle entspricht einer Ganzzahldivision durch 2, während eine
    Linksverschiebung der Multiplikation mit 2 entspricht. Eine
    Verschiebeoperation schreibt man:
    Variable <<
        Anzahl
      Variable
        >> Anzahl
    
    
    Dabei ist "Variable" die zu manipulierende Variable, während
    Anzahl die Stellenzahl ist, um die das Bitmuster verschoben werden
    soll.
    
    Beispiel 2:
    
    char alfa, L1, L3,
        R;
       alfa =
        6;
      L1 = alfa
        <<
        1;
      L3 = alfa
        << 3;
      R  =
        alfa
        >> 2;
      
    
    
    
      
        
          alfa 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          1 
           | 
          1 
           | 
          0 
           | 
        
        
          L1 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          1 
           | 
          1 
           | 
          0 
           | 
          0 
           | 
        
        
          L3 
           | 
          0 
           | 
          0 
           | 
          1 
           | 
          1 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
        
        
          R 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          0 
           | 
          1 
           | 
        
      
    
    
    
    
    
    
    Increment
und
      Decrement
    
    Recht häufig ist es erforderlich, eine Variable um 1 zu
    erhöhen (incrementieren) oder um 1 zu vermindern (decrementieren).
    
    alfa = alfa +
        1;       // Increment
      beta =
        beta
        -1;        // Decrement
    
    
    Dafür gibt es in C eine Kurzschreibweise.
    alfa++;  
             // Increment
      ++alfa;  
             // Increment
      beta--;  
             // Decrement
      --beta;  
             // Decrement
      
    
    Wie man sieht, gibt es sogar jeweils zwei unterschiedliche
    Schreibweisen. Welche Schreibweise man verwendet ist, nur dann von
    Bedeutung, wenn man diese Kurzschreibweise innerhalb eines Ausdrucks
    verwendet. Steht "++" oder "--" vor der Variablen, dann wird
    Increment
    bzw. Decrement zuerst ausgeführt, und der veränderte Wert im
    Ausdruck verwendet. Ansonsten wird der alte Wert im Ausdruck
    verwendet,
    und erst abschließend die Variable incrementiert bzw.
    decrementiert. 
    Im ersten Beispiel wird alfa noch vor der Multiplikation
    incrementiert,
    beta erhält den Wert 20.
    int alfa, beta;
      alfa = 3;
      beta =
        ++alfa
        * 5;
    
    
    Im zweiten Beispiel wird alfa erst nach der Multiplikation
    incrementiert, beta erhält den Wert 15.
    int alfa, beta;
      alfa = 3;
      beta =
        alfa++
        * 5;
    
    
    In beiden Fällen hat alfa zum Schluss den Wert 4.
    
    
    Reihenfolge / Priorität der Operationen (ueberarbeiten!)
    
    In einem langen Ausdruck mit vielen unterschiedlichen Operatoren
    muss
    man diese Operationen in der richtigen Reihenfolge ausführen, um
    zum richtigen Ergebnis zu kommen.
    int alfa;
      alfa = 5
        + 4 *
        2;
    
    
    Welchen Wert wird alfa bekommen? Wir erinnern uns, dass
    Punktrechnung
    vor Strichrechnung kommt. folglich hat alfa den Wert 13.
    Falls man
    eigentlich zuerst die Addition ausgeführt haben wollte,
    müsste man folgendes Schreiben:
    int alfa;
      alfa = (5
        + 4)
        * 2;
    
    
    Folglich gilt also, dass Klammern noch vor Punktrechnung "gehen".
    Dass
    ergibt dann folgende Priorität: Klammern -> Punktrechnung ->
    Strichrechnung.
    
    Nun gibt es in C aber deutlich mehr Operatoren. Deren Prioritäten
    sind in nachfolgender Tabelle festgehalten:
    
    
      
        
          Priorität 
           | 
          Operator 
           | 
          Beispiel 
           | 
          Erläuterung 
           | 
        
        
          1 
           | 
          ( 
            ) 
           | 
          (a+b)*c 
           | 
          Klammern 
           | 
        
        
          2 
           | 
          ! 
~ 
            ++  --  -  *  & 
           | 
          a =
            &b 
           | 
           
           | 
        
        
          3 
           | 
          * 
/ 
            % 
           | 
          a % b 
           | 
          Punktrechnung 
           | 
        
        
          4 
           | 
          + 
            - 
           | 
          a + b 
           | 
          Strichrechnung 
           | 
        
        
          5 
           | 
          << 
            >> 
           | 
          a = b
            >> c 
           | 
          verschieben 
           | 
        
        
          6 
           | 
          < 
            <= 
            > 
            >= 
           | 
          a
            >= b 
           | 
          größer, kleiner,
            gleich  
           | 
        
        
          7 
           | 
          == !=
            & 
           | 
          a = b
            & c 
           | 
          bitweises UND 
           | 
        
        
          8 
           | 
          | 
           | 
          a = b
            | c 
           | 
          bitweises ODER 
           | 
        
        
          9 
           | 
          ^ 
           | 
          a = b
            ^ c 
           | 
          bitweises XOR 
           | 
        
        
          10 
           | 
          && 
           | 
          a
            && b 
           | 
          logisches UND 
           | 
        
        
          11 
           | 
          || 
           | 
          a ||
            b 
           | 
          logisches ODER 
           | 
        
        
          12 
           | 
          = 
+=  
            -=  *=  /=  
           | 
          a = b 
           | 
          Zuweisung 
           | 
        
      
    
    
    
    Wer sich dass nicht alles merken kann, kann ja in komplizierten
    Ausdrücken reichlich Klammern setzen, und so seinen Willen klar
    zum Ausdruck bringen. Überflüssige Klammern schaden ja nicht.
    Ich verwende reichlich Klammern.
    
    
-->
        weiter zu Programmablaufsteuerung
    
    
    
      zurück
          zu C für PICs , C-Compiler , PIC-Prozessoren , Elektronik , Homepage
    
     
    
    Autor: sprut 
    erstellt: 01.10.2007
    letzte Änderung: 23.10.2012