Aufbau eines C-Programms Ein C-Programm besteht aus Funktionen Jedes C-Programm muss eine Funktion haben die main() heißt • int main( ) • int main( int argc[ , char *argv[ ] [, char *envp[ ] ] ] ) Fast jedes C-Programm nutzt zusätzliche Funktionen aus Bibliotheken oder selbstdefinierte Funktionen • um diese zu verwenden müssen sie bekannt sein • Prototypen zeigen uns wie die Funktionen aussehen • Prototypen sind in „include-Dateien“ abgelegt. // Ihr erstes Programm #include <stdio.h> int main () { printf ("Hello World"); } Fachhochschule Frankfurt am Main University of Applied Sciences FB2 C ist case sensitive d.h. es wird zwischen GROSSund klein- Schreibung unterschieden main ≠ Main printf ≠ PRINTF 1 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Aufbau einer Funktion Jede Funktion besteht aus: • Funktionskopf • Funktionsblock int main(void) { int zahl = 0; int quadrat; Funktionskopf Beginn Funktionsblock Deklarationen printf(“Bitte Zahl eingeben “); scanf ( “%d“, &zahl); Anweisungen quadrat=zahl * zahl; printf(“Quadrat ist: %4d\n“,quadrat); return 0; } Fachhochschule Frankfurt am Main University of Applied Sciences FB2 2 Ende Funktionsblock Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Regeln C ist formatfrei • Anweisungen können über mehrere Zeilen geschrieben werden C besteht im wesentlichen aus Funktionsaufrufen • außer mathematischen und logischen Verknüpfungen und einigen Kontrollstrukturen • Funktionen sind in Bibliotheken abgelegt • das Format einer Funktion wird durch Prototypen beschrieben • Prototypen sind in sogenannten Header-Dateien (name.h) deklariert. • Um Funktionen aus Bibliotheken zu nutzen, muss die Header-Datei in den Code „hineingeholt“ werden (durch #include) – #include <stdio.h> oder #include "my_fkt.h" Die main() Funktion muss genau einmal in einem C Programm vorkommen. Jeder Funktionscode ist in { } eingeschlossen Jede Anweisung wird mit Semikolon abgeschlossen; Fachhochschule Frankfurt am Main University of Applied Sciences FB2 3 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Notationsregeln Bezeichner • Bezeichner bestehen aus einer Folge von Buchstaben (Klein- und Großbuchstaben) oder Ziffern oder Unterstrich. • Es wird zwischen Groß- und Kleinschreibung unterschieden. • Mindestens die ersten 31 Stellen sind signifikant. • alle Schlüsselwörter sind reserviert • ( keine Umlaute ) Trennzeichen • Definitionen und Anweisungen muss man durch das Zeichen „Semikolon“ abschließen. • Bezeichner und Schlüsselwörter muss man trennen durch Leerzeichen, Tabulatoren, Zeilenendezeichen, Operatoren oder Kommentare. • Mehrere Leerzeichen, Tabulatoren und Zeilenendezeichen hintereinander interpretiert der Compiler wie ein Leerzeichen. Fachhochschule Frankfurt am Main University of Applied Sciences FB2 4 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Kommentare Kommentare werden zum besseren Verständnis der schrittweisen Codeausführung zum Code hinzugefügt. Kommentare sollten Informationen bereitstellen, die durch das blosse Lesen des Codes nicht deutlich werden. Kommentare, die nur das Offensichtliche wiederholen, • • fügen nichts Brauchbares zum Code hinzu. schaffen zusätzliches Codeverwaltungsproblem, – denn bei jeder Änderung des Codes – müssen auch die entsprechenden Kommentare überarbeitet werden. // das ist ein Kommentar bis zum Zeilenende y = x1 + x2; // Kommentar nach Anweisung bis Zeilenende /* das ist ein Kommentar über mehrere Zeilen dies ist somit kein Code y = x1 + x2; */ Fachhochschule Frankfurt am Main University of Applied Sciences FB2 5 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Schlüsselwörter auto const enum if short switch while break default extern int signed typedef volatile case do float long sizeof union char double for register static unsigned continue else goto return struct void Datentypen short long 16 bit 32 bit • char Zeichen • int Ganzzahl • float, double Gleitkommazahl 32 bit signed unsigned vorzeichenbehaftet vorzeichenlos 64 bit Fachhochschule Frankfurt am Main University of Applied Sciences FB2 6 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Definition einer Variablen Werte (Ergebnisse, Zwischenergebnisse usw.) werden während des Programmablaufs in Variablen gespeichert. Eine Variable ist ein Speicherbereich, den Ihnen der Compiler zur Verfügung stellt. Jede Variable hat einen Namen und einen Wert. Der Name wird vom Compiler mit einer bestimmten Adresse im Speicher identifiziert, unter der der Wert abgelegt wird. Eine Variable muss vor ihrer Benutzung definiert werden. Bei der Definition müssen Sie einen Datentyp angeben. Der Datentyp bestimmt die Größe des zur Verfügung gestellten Speicherbereiches. Anmerkung: Wieviel Speicherplatz die einzelnen Datentypen belegen, ist implementationsabhängig. Mit Hilfe des Operators „sizeof“ können Sie den jeweiligen Speicherbedarf ermitteln. Die Wertebereiche für die einzelnen Datentypen sind ebenfalls implementationsabhängig und können den Dateien „limits.h“ und “float.h“ entnommen werden. Fachhochschule Frankfurt am Main University of Applied Sciences FB2 7 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Elementare Datentypen int ist implementationsabhängig 2 Byte oder 4 Byte Fachhochschule Frankfurt am Main University of Applied Sciences FB2 8 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Darstellung von Konstanten Zeichenkonstanten: ‘a‘ ‘Z‘ Zeichen eingeschlossen in ‘...‘ Der Wert ist der numerische Wert des Zeichens im verwendeten Zeichensatzes. ‘\n‘ ‘+‘ ‘\0‘ ganzzahlige Konstanten: '0' ist 1 Byte 364 23u 3271L 010 0xAB Ganzzahlige Konstanten bestehen aus einer Ziffemfolge und werden üblicherweise dezimal angegeben. Um “unsigned“- oder “long“-Konstanten anzugeben, müssen Sie die Suffixe “u“ oder “U“, bzw. “I“ oder “L“ anhängen. Oktale Konstanten beginnen mit einer führenden Null, hexadezimale Konstanten mit „0x“ oder „0X“. Für die Darstellung der hexadezimalen Ziffern größer 9 werden die Groß- oder Kleinbuchstaben A-F, bzw. a-f verwendet. Fachhochschule Frankfurt am Main University of Applied Sciences FB2 9 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Darstellung von Konstanten Gleitkommakonstanten: 2.3 .4F 238e10 2.156E-8 0.471 Gleitkommakonstanten haben mindestens einen Dezimalpunkt oder einen Exponenten (durch „e“ oder „E“ gekennzeichnet). In der Regel ist eine Gleitkommakonstante vom Datentyp „double“, es sei denn sie wird durch einen Suffix „f“ oder „F“ als „float“ bzw. durch „I“ oder „L“ als „long doubie“ gekennzeichnet. Zeichenkettenkonstanten: '0' ist 1 byte "0" ist 2 byte “Hallo!“ Folge von Zeichen eingeschlossen in “ .... “ Zeichenkettenkonstanten werden als Folge von Einzelzeichen, abgeschlossen durch ein NULL-Zeichen, im Speicher abgelegt. Alle Darstellungen von Zeichenkonstanten können auch in Zeichenketten benutzt werden. Zeichenketten werden stets mit '\0' beendet! Fachhochschule Frankfurt am Main University of Applied Sciences FB2 10 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Schlüsselwort „const“ Durch Voranstellen des Schlüsselwortes “const“ kann bei der Definition einer Variablen angegeben werden, dass sich ihr Wert nicht ändert. Solche Variablen müssen Sie bei der Definition initialisieren. Beispiel: int main (void) { const double pi = 3.14159; ...... pi = 3.14; /* fuehrt zu Fehlermeldung des Compilers */ ...... return 0; } Fachhochschule Frankfurt am Main University of Applied Sciences FB2 11 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Variablenzuweisung Variablen werden auch L-Werte genannt, weil sie auf der linken Seite einer Zuweisung stehen können. Konstanten sind R-Werte. Bei einer Zuweisung können sie nur auf der rechten Seite vorkommen. Nicht initialisierte Variablen enthalten zufällige Werte. Im Definitionsteil eines C-Programms können Sie lnitialisierungen wie folgt vornehmen: <Datentyp> <Variablenname> = <Anfangswert>; Im Definitionsteil eines C-Programms können Sie Zuweisungen wie folgt vornehmen: <Variablenname> = <Wert>; <Variablenname1> = <Variablenname2>; Sprachgebrauch: • in eine Variable schreiben • aus einer Variablen lesen Fachhochschule Frankfurt am Main University of Applied Sciences FB2 12 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Unterschied Variable und Konstante printf("%i",10); Konstante sind Werte • die direkt im Quelltext angegeben werden Variablen sind Speicherstellen int i = 10; i = i + 4; • die einen Wert speichern können • dieser Wert (der Wert der Variable) kann mehrmals gelesen werden • die Variable kann mit neuen Werten beschrieben werden x = 2 * i; Variable haben • einen Wert • und eine Adresse Konstante haben • nur einen Wert . Fachhochschule Frankfurt am Main University of Applied Sciences FB2 13 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Eingabe, Ausgabe Ein- und Ausgabe einzelner Zeichen • int putchar (int) – schreiben Zeichen auf Standard-Ausgabe (Bildschirm) • int getchar (void) – holen des nächsten Zeichens von der Standard-Eingabe (Tastatur) Ein- und Ausgabe kompletter Zeichenketten • printf und scanf sind mehr Zeichen / Zeichenketten in der Tastatur eingegeben worden, als aktuell eingelesen werden sollen • so bleiben diese im zugehörigen Puffer – stdin – stdout die Standard-Eingabe, d.h. die Tastatur die Standard-Ausgabe, d.h. der Bildschirm • Puffer können mit fflush geleert werden. – z.B. fflush (stdin); int fflush (FILE * stream); Fachhochschule Frankfurt am Main University of Applied Sciences FB2 14 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Ein- und Ausgabefunktionen getchar( ) und putchar( ) • getchar( ) oder den • putchar ( ) Einlesen eines Zeichens von der Standardeingabe. Die Funktion liefert als Resultat eine ganze Zahl, die den Tabellenwert für ein Zeichen darstellt, Wert EOF bei Dateiende. Die symbolische Konstante EOF hat typischerweise den Wert - 1 und ist definiert in der „stdio.h“. Ausgabe eines Zeichens auf die Standardausgabe (Terminal) Beispiel: #include <stdio.h> int main (void) { int zeichen; printf(“Zeichen eintippen > “); zeichen = getchar(); putchar(zeichen); printf(“ hat den Code: dez. %d okt. %o hex. %x\n“, zeichen, zeichen, zeichen); return 0; } Fachhochschule Frankfurt am Main University of Applied Sciences FB2 15 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Ein- und Ausgabefunktionen scanf( ) und printf( ) • scanf( ) • printf( ) dient zur formatierten Eingabe von Zeichenketten dient zur formatierten Ausgabe von Zeichenketten Syntax: • Befehlswort ( „Steuerstring“, Argumente); Beispiel: • printf (“%6.2f „%6.2f \n“, 20.0 / 7.0, 4.73); Datentransfer: • Bei beiden Funktionen wird der Datentransfer durch den Steuerstring mit Formatelementen gesteuert. • Die Argumente werden in Zeichenketten umgewandelt und ersetzen die zugehörigen Formatelemente im Steuerstring. • Dann wird der so aufbereitete Steuerstring ausgegeben . Fachhochschule Frankfurt am Main University of Applied Sciences FB2 16 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer printf - Formatangaben printf = print formatted • printf ("Steuerstring", [argument_1, .., argument_n]); \t \n %i %s der Steuerstring kann mit Escape Sequenzen als auch mit Formatelementen formatiert werden Argument printf ("Der Wert von 2 * 3 ist %i\n", 6); • Es findet nacheinander eine Ersetzung der Steuerzeichenketten durch die Argumente statt. printf ("Der Wert von %i * 3 ist %i\n", 2, 6); Sind mehr Steueranweisungen als Argumente vorhanden, so erzeugt dies einen Fehler (nur Warnung beim Compiler!) Fachhochschule Frankfurt am Main University of Applied Sciences FB2 17 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Formatierung Häufige Escape Sequenzen • \t Tabulator • \n new line • \\ \? \' \" (neue Zeile) Sonderzeichen \ ? ' " Häufig benutzte Formatelemente • • • • %c %i %f %e Zeichen Ganzzahl Gleitkommazahl Gleitkommazahl Zusätzliche Formatierung • • • • + 6 .2 x.xxxxxx x.xxxxxe+yyy d, u, o, x, X g E zwischen % und Buchstabe linksbündig mit Vorzeichen minimale Feldweite (hier 6) bei Festkomma: Anzahl zu schreibender Zeichen (hier 2) bei Gleitkomma: Anzahl der Nachkommastellen Fachhochschule Frankfurt am Main University of Applied Sciences FB2 18 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Ausgabe mit printf() Prototyp in stdio.h Escape-Sequenzen in Zeichenketten Escape-Sequenz '\a' '\b' '\f' '\n' '\r' '\t' '\v' '\\' '\' ' '\" ' '\? ' '\ooo' '\xhh' Fachhochschule Frankfurt am Main University of Applied Sciences FB2 Ausführung akustisches Signal, bell Rückschritt, backspace Seitenvorschub, formfeed Zeilenendezeichen, newline Zeilenrücklauf, carriage return horizontaler Tabulator, tab vertikaler Tabulator \ ' " ? Zeichen in Oktaldarstellung Zeichen in Sedezimaldarstellung 19 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer printf() – Formatelemente: Zahlen printf ("%i + %i = %i\n", 5, 5, 10); Fachhochschule Frankfurt am Main University of Applied Sciences FB2 20 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer printf() – Formatelemente: Zeichen + Zeiger Fachhochschule Frankfurt am Main University of Applied Sciences FB2 21 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer printf() - Formatangaben - Feldangaben Zwischen % und Formatbuchstaben eines Formatelements Fachhochschule Frankfurt am Main University of Applied Sciences FB2 22 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer scanf() Mit „scanf()“ werden Werte eingelesen, in eine oder mehrere Variablen. Wir werden diese Funktion nur mit einem Formatelement benutzen. Das zugehörige Argument muss die Adresse einer Variablen sein und wird geschrieben: &<Variablenname>. „scanf()“ liest nur, solange für das Format gültige Zeichen vorliegen oder bis zum nächsten Leerzeichen, Tabulator oder Zeilenendezeichen oder bis zum Dateiende. Zwischen “%“ und Formatbuchstabe eines Formatelements können Sie die maximale Anzahl der Zeichen festlegen, die eingelesen werden sollen. Die Funktion „scanf()“ liefert als Rückgabe-Wert: 1 wenn Zeichen dem Format entsprechend gelesen wurden 0 wenn keine Zeichen dem Format entsprachen EOF wenn das Dateiende erreicht wurde Mit dem Rückgabe-Wert kann ein erfolgreiches Lesen überprüft werden. Fachhochschule Frankfurt am Main University of Applied Sciences FB2 23 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Keine Ausgaben mit scanf()! scanf() Mit scanf() können Werte eingelesen werden • Prototyp definiert in stdio.h • int scanf (%Steuerstring, Argumente, ..); Ähnliche Formatanweisung wie bei printf() • • • • %c %s %i %f Zeichen String Ganzzahl Gleitkommazahl d, u, o, x, X Modifizierer • %l • %h long short %lf %Lf Rückgabewert der Funktion • Anzahl der erfolgreich eingelesenen Werte – bei Fehler in Konvertierung erfolgt Abbruch Fachhochschule Frankfurt am Main University of Applied Sciences FB2 24 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Argumente müssen Adressen sein! scanf() - Argument Neben dem Steuerstring müssen bei scanf Argumente übergeben werden. • Diese Argumente geben die Speicherstellen an, wo die Funktion scanf die eingelesenen Werte ablegen soll. • Die Speicherstelle einer Variablen, d.h. den Ort (l-value) an dem der Wert gespeichert ist erhält man über den Adressoperator & • Der Datentyp der Variable und die Formatanweisung müssen zueinander passen! float f; int i, k; printf("Eingabe erstes Argument:\t"); i = scanf("%f",&f); printf ("Eingabe zweites Argument:\t"); i += scanf("%i",&k); printf("Anzahl der erfolgreich eingelesenen Argument ist: %i\n", i); Fachhochschule Frankfurt am Main University of Applied Sciences FB2 25 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Und noch ein scanf() – printf() Beispiel #include <stdio.h> int main (void) { char ch; int i; float x; double y; scanf(“%c“, &ch); scanf(‘%d“, &i); scanf(“%f“, &x); scanf(“%lf“, &y); printf (“Variable ch: %c \n“,ch); printf (“Variable i (dezimal): %d \n“,i); printf (“Variable i (oktal): %o \n“,i); printf (“Variable i (hex): %x \n“,i); printf (“Variable x: %f Variable y: %lf \n“, x, y); printf (“ : %s : \n“, “hallo“); printf (“ : %10s: \n“, “hallo“); printf (“ : %-10s: \n“, “hallo“); printf(“ :%6.2f: \n“, x); return 0; } Fachhochschule Frankfurt am Main University of Applied Sciences FB2 26 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Wir rechnen i = 10; In Ausdrücken werden Variable und Konstante mit Operatoren verknüpft Die Wert eines Ausdrucks wird einer Variablen zugewiesen Datentypen bestimmen Speicherplatz und die nötige Konversion Mögliche Arithmetische Operatoren in C Achtung bei Integer-Division gibt es einen Rest! * / + % ~ << >> sei x1 = 10 und x2 = 3 Multiplikation y = x1 * x2; Division y = x1 / x2; Addition y = x1 + x2; Subtraktion y = x1 - x2; Divisionsrest y = x1 % x2; Einer-Komplement y = ~x1; bitweise Negation shift nach links y = x1 << 1; shift nach rechts y = x1 >> 1; Punktrechnung vor Strichrechnung! Fachhochschule Frankfurt am Main University of Applied Sciences FB2 27 dann ist y 30 3 13 7 1 -11 20 5 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Ein Rechenbeispiel #include <stdio.h> int main (void) { float a, b, c; int i, j, k; a = 5.0; b 7.0; i = 8; j = 5; c = a - 5. + b; printf(“c = %6.2f \n“, c); c = a + b * b * b; printf(“c = %6.2f \n“, c); c = a / ( b + 4. ); printf(“c = %6.2f \n“, c); k = i / j; printf(“k = %d \n“, k); k = i % j; printf(“k = %d \n“, k); return 0; } Fachhochschule Frankfurt am Main University of Applied Sciences FB2 28 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Vergleiche und Logische Verknüpfungen C kennt folgende Vergleichsoperatoren: < kleiner <= kleiner gleich > grösser >= grösser gleich == gleich != ungleich C kennt folgende logische Operatoren: ! logische Negation && logisches Und || logisches Oder Der Wert eines Vergleichs- oder logischen Ausdrucks ist: 1, wenn der Ausdruck wahr ist 0, wenn der Ausdruck falsch ist #include <stdio .h> int main (void) { int i = 0, j = 0; /* Werte einlesen */ printf (“Bitte i eingeben: “); scanf (“%d“, &i); printf(“Bitte j eingeben: “); scanf(“%d“, &j); /* Eingabe ueberpruefen */ if ( i>j && i > 0 && j > 0) printf(“i > j und beide Zahlen sind positiv\n“); return 0; } Fachhochschule Frankfurt am Main University of Applied Sciences FB2 29 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Zuweisungsoperatoren C kennt folgende Zuweisungsoperatoren: = += -= *= /= %= #include <stdio .h> Zuweisung a += b entspricht a = a + b a -= b entspricht a = a - b a *= b entspricht a = a * b a /= b entspricht a = a / b a %= b entspricht a = a % b int main (void) { int i‚ j, k; i = j = k = 5; printf(“i = %d, j = %d, k = %d\n“,i,j,k); Der Wert einer Zuweisung ist der zugewiesene Wert und kann weiter verwendet werden z. B. für Zuweisungen oder Vergleiche. i += 2; printf(“i = %d\n“,i); i *= j + 2; printf(“i = %d\n“,i); return 0; } Fachhochschule Frankfurt am Main University of Applied Sciences FB2 30 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Inkrement- und Dekrementoperatoren Inkrement- und Dekrementoperator ++ Inkrementoperator (Inhalt einer Variablen um 1 erhöhen) -- Dekrementoperator (Inhalt einer Variablen um 1 vermindern) Inkrement- und Dekrementoperator können vor oder hinter dem Operanden stehen. Der Operand muss ein L-Wert sein und darf nicht mehr als einmal in einem Ausdruck vorkommen. Steht der Operator vor dem Operanden (z.B. ++i) ‚ geschieht folgendes: 1. Variable i inkrementieren 2. Den Wert des Ausdrucks mit dem neuen Wert von i berechnen Steht der Operator hinter dem Operanden (z.B. i++), geschieht folgendes: 1. Wert von i merken 2. Den Wert des Ausdrucks mit dem alten Wert von i berechnen 3. Variable i inkrementieren Fachhochschule Frankfurt am Main University of Applied Sciences FB2 31 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Ein Inkrementbeispiel #include <stdio.h> int main (void) { int i, j; i = 5; printf (“i = %d\n“, i); Und das kommt raus: i=5 j = ++i + 1; printf(“i = %d, j = %d\n“, i‚ j); i = 6, j = 7 j = 4 + i++; printf(“i = %d, j = %d\n“, i‚ j); return 0; i = 7, j = 10 } Fachhochschule Frankfurt am Main University of Applied Sciences FB2 32 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Weitere Operatoren Anstelle der reinen arithmetischen Verknüpfungen (+, *) und der reinen logischen Verknüpfung (&&, ||) gibt es noch Bit-Operatoren • & | ^ ~ << >> für die Manipulation von einzelnen bits innerhalb von Zahlen bitweise UND-Verknüpfung bitweise ODER-Verknüpfung bitweise Exclusiv-Oder Verknüpfung bitweise Negation bits der Zahl um Anzahl (rechter Parameter) nach links schieben bits der Zahl um Anzahl (rechter Parameter) nach rechts schieben ebenso die Verknüpfung von Operatoren &= |= ^= <<= >>= Fachhochschule Frankfurt am Main University of Applied Sciences FB2 33 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Logische Verknüpfungen Verknüpfungsergebnis durch Wahrheitstabelle x1 0 0 1 1 x2 0 1 0 1 y 0 0 0 1 x1 0 0 1 1 x2 0 1 0 1 y 0 1 1 1 x1 0 0 1 1 x2 0 1 0 1 y 0 1 1 0 UND-Verknüpfung y = x1 & x2; ODER-Verknüpfung y = x1 | x2; XOR-Verknüpfung y = x1 ^ x2; Fachhochschule Frankfurt am Main University of Applied Sciences FB2 34 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Hierarchiestufen der Operatoren Wie auch in Mathe gilt allerdings gibt es hier noch mehr Operatoren, so daß man auf die Reihenfolge achten muss Innerhalb dergleichen Stufe werden fast alle Operatoren in der Reihenfolge verarbeitet, wie sie im Ausdruck erscheinen, von links nach rechts Ausnahmen: Zuweisungsoperatoren, bedingte Ausdruck im Zweifelsfall setzt man lieber Klammern Priorität fällt • Punktrechnung vor Strichrechnung Fachhochschule Frankfurt am Main University of Applied Sciences FB2 Operator -> . [] () ++ -++ -+ - ~ ! * & () * / % + << >> < <= > >= == != & ^ | && || ?: = +=, etc. , 35 Gruppe Memberauswahl Klammern postfix prefix Vorzeichen, Inversion dereference, adress, cast Punktrechnung Strichrechnung Shift Relation Gleichheit bitweise Operation logische Operation Bedingungsoperator Zuweisung Komma Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Umwandlung von arithmetischen Datentypen Verknüpft ein Operator Ausdrücke arithmetischen Datentyps, so führt der Compiler automatisch eine Datentypumwandlung durch, wenn die Operanden verschiedene Datentypen aufweisen. Dabei wird der „einfachere“ Datentyp in den „komplexeren“ umgewandelt. Hier ein paar nützliche Umwandlungsregeln: 1. Werte vom Typ char oder short werden stets in int umgewandelt. 2. Gleitkomma-Konstanten haben den Datentyp double, wenn sie nicht durch ein Suffix anders gekennzeichnet sind (z.B. 5.0f für float). 3. Hat ein Operand den Datentyp float, double oder long double, so wird der andere Operand, falls er ganzzahlig ist, in den gleichen Gleitkommatyp umgewandelt. 4. Bei einer Zuweisung wird der Wert auf der rechten Seite in den Datentyp der Variablen auf der linken Seite umgewandelt. Dabei kann es zu Datenverlust oder zu undefinierten Ergebnissen kommen. Fachhochschule Frankfurt am Main University of Applied Sciences FB2 36 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Umwandlungsbeispiele von arithmetischen Datentypen Beispiel 3 float a = 1.0, b = 7.0; int erg; erg = a / b; Ergebnis: 0.142857 Regel 4: Die Dezimalstellen gehen verloren Also „erg“ hat den Wert 0 Beispiel 1 int a = 5, b = 7; float erg; erg = a / b; Regel 3 kann nicht angewandt werden Also Ergebnis 0 Die Variable „erg“ hat den Wert 0 Beispiel 2 int a = 5; float erg, b = 7.0; erg = a / b; Regel 3: Der Wert von a wird in float umgewandelt. Das Ergebnis ist: 0.714285 Die Variable „erg“ bekommt die Dezimalstellen Fachhochschule Frankfurt am Main University of Applied Sciences FB2 37 Beispiel 4 double a = 2147483647.0, b = 2.0; int erg; erg = a * b; Ergebnis: 4294967294.0 Regel 4: Vorausgesetzt eine int- Darstellung von 31 bits, dann ist die größte positive Zahl 2147483647(= 231-1) Der Wert von „erg“ ist undefiniert. Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer Umwandlung mit Hilfe des cast-Operators Mit Hilfe des Umwandlungsoperators (cast-Operators) können Sie eine Datentypumwandlung erzwingen: Syntax: (Datentyp) Ausdruck Ein Ausdruck mit Umwandlungsoperator ist kein L-Wert. Beispiel 1: double erg; erg = 5.0 / 7; Bei Konstanten genügt es, wenn bei einem Operanden die Gleitkommadarstellung genommen wird. So kann Umwandlungsregel 3 angewandt werden. (erg = (double) 5 / 7 ist auch möglich) Beispiel 2: int a = 5 ‚ b = 7; double erg; erg = (double) a / b; Bei Variablen ist der Umwandlungsoperator die einzige Möglichkeit, wenn die Variablendefinition nicht verändert werden soll. Fachhochschule Frankfurt am Main University of Applied Sciences FB2 38 Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer