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