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
nach oben

zurück zu C für PICs , C-Compiler , PIC-Prozessoren , Elektronik , Homepage



Autor: sprut
erstellt: 01.10.2007
letzte Änderung: 23.10.2012