![]() |
Programmieren in Cvon Prof. Dr. Rainer Thomas |
--> Die Zuweisung ist ein Ausdruck.
Ihr Wert ist der Wert, der der linken Seite zugewiesen wird.
| z.B.: | a=7 | hat den Wert 7 |
--> die Zuweisung wird ebenfalls erst durch das abschließende ";" zu einer Anweisung.
Auch ein -wie ein Prozeduraufruf aussehender- alleiniger Funktionsaufruf stellt -mit abschließendem ";" - eine Ausdrucksanweisung dar.
| z.B.: | printf("Hallo !") | ist ein Sonderfall eines Ausdrucks
(ein einzelner Operand) |
| printf("Hallo !"); | ist eine Ausdrucksanweisung |
| + | Addition |
| - | Subtraktion |
| * | Multiplikation |
| / | Division (ganzzahlige u n d Gleitpunkt-Division) |
| % | Modulus |
| + | Identität | (neu in ANSI-C) | |
| - | Negation |
| + | - | (unär) | höhere Priorität |
| * | / | % | |
| + | - | ||
| ... | |||
| = | niedrigere Priorität |
Änderung der Priorität durch Klammerung :
Beispiel : a = (b = c / ( d * e ) ) + f ;
/*-----------------------------------------------------------------*/
/* Programm DIVDEM */
/*-----------------------------------------------------------------*/
/* Demonstrationsprogramm zum Divisions-Operator */
/*-----------------------------------------------------------------*/
#include <stdio.h>
void main(void)
{
int i=7, j=4, k;
double a,b,c,d;
k=i/j; /* k = 1 ! */
a=i; /* automatische */
b=j; /* Typkonvertierung */
c=a/b; /* c = 1.75 ! */
d=i/j; /* d = 1.0 ! */
printf("\nk = %d\nc = %f\nd = %f\n",k,c,d);
k=a/b;
printf("\nk = %d\n",k);
Bildschirmausgabe :
E:\>divdem k = 1 c = 1.750000 d = 1.000000 k = 1
| ++ | Increment (Erhöhung des Operanden um 1)
x++ entspricht x=x+1 |
| -- | Decrement (Erniedrigung des Operanden um 1)
x-- entspricht x=x-1 |
| ++n | bzw. | --n |
| z.B. | n=5;
x=++n; |
entspricht |
n=n+1; x=n; |
(x <-- 6) |
| n++ | bzw. | n-- |
| z.B. | n=5;
x=n++; |
entspricht |
x=n; n=n+1; |
(x <-- 5) |
++ und -- haben gleiche Priorität wie unäre + und -.
| > | größer |
| >= | größer gleich |
| < | kleiner |
| <= | kleiner gleich |
| == | gleich |
| != | ungleich |
| 1 | wenn der Vergleich erfüllt ist | (--> "TRUE") |
| 0 | wenn der Vergleich nicht erfüllt ist | (--> "FALSE" ) |
| arithmetische Operatoren | höhere Priorität |
| > | >= | < | <= |
| == | != |
| = | niedrigere Priorität |
/*------------------------------------------------------------------*/
/* Programm VERGLDEM */
/*------------------------------------------------------------------*/
/* Demonstration der bei Anwendung der Vergleichsoperationen */
/* entstehenden Werte */
/*------------------------------------------------------------------*/
#include <stdio.h>
void main(void)
{
int i=3, j=3, k=2;
printf("i==j --> %d\n",i==j); /* --> 1 entspr. "TRUE" */
printf("i>k --> %d\n",i>k); /* --> 1 entspr. "TRUE" */
printf("i<k --> %d\n",i<k); /* --> 0 entspr. "FALSE" */
}
/*------------------------------------------------------------------*/
Bildschirmausgabe :
E:\>vergldem i==j --> 1 i>k --> 1 i<k --> 0
| Wert | 0 | entspricht | FALSE |
| Werte | !=0 | entsprechen | TRUE |
| && | UND |
| || | ODER |
| ! | Negation | ! konvertiert einen Nicht-0 (= TRUE)- Operanden in den Wert 0 und einen 0 (=FALSE)-Operanden in den Wert 1 |
| statt | if (inword==0) |
| --> | if (!inword) |
! hat die gleiche Priorität wie die anderen unären Operatoren (z.B. -)
&& und || haben eine geringere Priorität als die Vergleichsoperatoren, wobei && höhere Priorität als || hat.
z.B. wird in (x&&y++) y++ nur ausgeführt, wenn x!=0 (=TRUE) ist
/* ------------------------------------------------------------------- */
/* Programm CHARZAHL */
/* ------------------------------------------------------------------- */
/* Zaehlen der Bu, Zi, SoZ und StZ in dem ueber stdin eingegebenen */
/* Text */
/* ------------------------------------------------------------------- */
#include <stdio.h>
void main(void)
{ int c, zbu, zzi, zso, zst;
zbu=zzi=zso=zst=0;
while((c=getchar())!=EOF)
if (c<='\x1F' || c=='\x7F') /* Steuerzeichen */
zst++;
else if (c>='0' && c<='9') /* Ziffern */
zzi++;
else if (c>='A' && c<='Z' || c>='a' && c<='z') /* Buchstaben */
zbu++;
else zso++; /* Sonderzeichen */
putchar('\n');
printf("Buchstaben = %4d\n",zbu);
printf("Ziffern = %4d\n",zzi);
printf("Sonderzeichen = %4d\n",zso);
printf("Steuerzeichen = %4d\n",zst);
}
/* -------------------------------------------------------------------- */
Bildscirmausgabe :
E:\RT\C\VORL>charzahl <charzahl.c Buchstaben = 318 Ziffern = 12 Sonderzeichen = 823 Steuerzeichen = 31
& bitweises UND | bitweises ODER ^ bitweises EXOR
~ bitweise Negation (1-Komplement)
int c,n; ... c = n & 0x7f;
char c; ... if (c<='z' && c>='a') c = c & 0xdf;
char C; ... if (c<='Z' && c>='A') c = c | 0x20;
| int x; | |
| ... | |
| x = x & 0xffc0; | nur richtig für 16-Bit-Integer
---> nicht portabel |
| ... | |
| x = x &~0x3f; | unabhängig von Integer-Länge
---> portabel |
| << | Linksschieben |
| >> | Rechtsschieben |
Der linke Operand wird um soviel Stellen (Bit) nach links bzw rechts geschoben, wie der rechte Operand angibt
| Linksschieben : | Nachschieben von 0 |
| Rechtsschieben : | wenn linker Operand unsigned : | logisches Schieben |
| wenn linker Operand signed : | arithmetisches oder logisches Schieben (compilerabhängig) |
int x; ... x = x << 2; /* Linksschieben des Werts von x um 2 Bit, */ /* Nachschieben von 0 --> Multiplikation mit 4 */
unsigned y; ... y = y >> 2; /* Rechtsschieben des Werts von y um 2 Bit, */ /* Nachschieben von 0 */ /* --> Division durch 4, unsigned ! */
unsigned getbits( unsigned x, unsigned p, unsigned n)
{
return ((x >> (p+1-n)) & ~(~0 << n));
}
var = var operator ausdruckvor
Beispiele :
x = x + wert; y = y * faktor;
| += | : | x += ausdr | <-- | x = x + ausdr |
| -= | : | x -= ausdr | <-- | x = x - ausdr |
| *= | : | x *= ausdr | <-- | x = x * ausdr |
| /= | : | x /= ausdr | <-- | x = x / ausdr |
| %= | : | x %= ausdr | <-- | x = x % ausdr |
| &= | : | x &= ausdr | <-- | x = x & ausdr |
| |= | : | x |= ausdr | <-- | x = x | ausdr |
| ^= | : | x ^= ausdr | <-- | x = x ^= ausdr |
| <<= | : | x <<= ausdr | <-- | x = x << ausdr |
| >>= | : | x >>= ausdr | <-- | x = x >> ausdr |
Beispiel :
| x = 3 + 2 | /* Ausdruck hat den Wert 5 */ |
| x *= 2 | /* Ausdruck hat den Wert 10 */ |
Die zusammengesetzten Zuweisungsoperatoren haben die gleiche Priorität wie der einfache Zuweisungsoperator (zweitniedrigste Prioritätsstufe)
|
Weglassen des gebrochenen Anteils |
|
Weglassen der höherwertigen Bits |
|
Runden oder Abschneiden (implementierungsabhängig)
Wenn nicht exakt darstellbar: Runden oder Abschneiden (implementierungsabh.) |
| char | --> | int |
| short | --> | int |
| float | --> | double |
| char (signed), short | --> | int |
| unsigned char, unsigned short | --> | int (wenn alle Werte darstellbar)
unsigned int (sonst) |
| long double | ("höchster" Typ) |
| double | |
| float | |
| unsigned long int | |
| long int | |
| unsigned int | |
| int | ("niedrigster" Typ) |

Der Cast-Operator wird unmittelbar vor den Ausdruck gesetzt, dessen Typ umgewandelt werden soll
---> Cast-Operator ---> Ausdruck --->
---> (Typangabe) --->
... int n=4; double dWert; dWert = sqrt((double)n); /* Type Cast notwendig, wenn für sqrt() Funktionsdeklaration alter Art verwendet wird, also kein Function Prototype vor- liegt, da sqrt() Parameter vom Typ double erwartet */ ... int j=2, k=3; float f; f = k/j; /* f bekommt den Wert 1.0 */ f = (float)k/j ; /* f bekommt den Wert 1.5 */

Definition als parameterisierter Makro:
| Priorität | Operator | Operation | Assoziativität |
|---|---|---|---|
| 15 *) | ()
[] . -> |
Funktionsaufruf
Indizierung (Array) Element (Structure) Element (Structure) |
---> **) |
| 14 | -
! ++ -- - + * ¨ (type) sizeof |
bitw. Komplement
Komplement Increment/Decrement Negation (arithm.) Identität (arith.) Pointer-Objekt Typkonvertierung Größe in Bytes |
<--- **) |
| 13 | * / % | Mult./Div. Modulo | ---> |
| 12 | + - | Addition/subtrakt. | ---> |
| 11 | << >> | Verschiebung | ---> |
| 10 | < > <= >= | Vergleich | ---> |
| 9 | == != | Vergleich | ---> |
| 8 | & | bitweises UND | ---> |
| 7 | ^ | bitweises EXOR | ---> |
| 6 | | | bitweises ODER | ---> |
| 5 | && | UND | ---> |
| 4 | || | ODER | ---> |
| 3 | ?: | bedingte Auswertung | <--- |
| 2 | =
*= /= %= += -= <<= >>= &= |= ^= |
Zuweisung | <--- |
| 1 | , | sequentielle Auswer. | ---> |
Zum
Inhaltsverzeichnis |
Zum
nächsten Abschnitt |