1 2 Grundelemente der C Programmierung 2006 Pearson Education, Inc. All rights reserved. 2 2.1 Einführung 2.2 Erstes Programm in C: Eine Zeile Text ausgeben 2.3 Varianten des ersten C Programms 2.4 Zweites C Programm: Ganze Zahlen addieren 2.5 Speicherkonzepte 2.6 Arithmetik 2.7 Fallunterscheidungen: Vergleichsoperatoren 2006 Pearson Education, Inc. All rights reserved. 3 2.1 Einführung • C Programmierung – Vier einführende Beispiele zeigen • Wie Meldungen ausgegeben werden • Wie Informationen vom Nutzer erhalten werden • Wie arithmetische Berechnungen durchgeführt werden • Wie Entscheidungen getroffen werden 2006 Pearson Education, Inc. All rights reserved. 2.2 Erstes Programm in C: Eine Zeile Text ausgeben 4 • Einfaches Programm – Gibt eine Zeile Text aus – Illustriert eine Reihe von wichtigen Eigenschaften von C 2006 Pearson Education, Inc. All rights reserved. 1 // Fig. 2.1: fig02_01.c 2 // Text-printing program. 3 #include <stdio.h> // allows program to output data to the screen Outline 5 4 5 // function main begins program execution 6 int main( void ) 7 { 8 fig02_01.c (1 von 1) printf( "Welcome to C!\n" ); // display message 9 10 return 0; // indicate that program ended successfully 11 12 } // end function main Welcome to C! 2006 Pearson Education, Inc. All rights reserved. 2.2 Erstes Programm in C: Eine Zeile Text ausgeben 6 • Kommentare – Erläutern das Programm anderen Programmierern • Verbessern die Lesbarkeit des Programms – Werden vom Compiler ignoriert – Einzeilenkommentare • Beginnen mit // • Beispiel // This is a text-printing program. – Mehrzeilenkommentare • Beginnen mit /* • Enden mit */ 2006 Pearson Education, Inc. All rights reserved. 7 Praxis-Tipp Jedes Programm sollte mit einem Kommentar beginnen, der den Zweck des Programms angibt, außerdem den Autor, das Datum und eine Versionsbezeichnung. (Im Rahmen dieser Folien wird aus Gründen der Übersichtlichkeit auf die Angabe von Autor, Datum und Versionsbezeichnung verzichtet.) 2006 Pearson Education, Inc. All rights reserved. 2.2 Erstes Programm in C: Eine Zeile Text ausgeben 8 • Präprozessor Direktiven – Steuern i.w. textliche Ersetzungen und Ergänzungen – Werden vor der Compilierung vom Präprozessor verarbeitet – Beginnen mit # – Beispiel #include <stdio.h> – Veranlasst den Präprozessor, die Headerdatei <stdio.h> für Ein- und Ausgabestrom einzuschließen. 2006 Pearson Education, Inc. All rights reserved. 9 Häufiger Programmierfehler Wenn man vergisst, die <stdio.h> Headerdatei in ein Programm einzuschließen, das Daten von der Tastatur einliest oder auf den Bildschirm ausgibt, meldet der Compiler einen Fehler. Der Compiler kann in solchen Fällen eine Bezugnahme auf Komponenten des Ein-/Ausgabestroms (z.B. printf) nicht erkennen. 2006 Pearson Education, Inc. All rights reserved. 2.2 Erstes Programm in C: Eine Zeile Text ausgeben 10 • Leerraumzeichen (‘White space’) – Leere Zeilen, Leerzeichen und Tabulatoren – Werden eingesetzt, um Programme besser lesbar zu machen – Werden vom Compiler ignoriert 2006 Pearson Education, Inc. All rights reserved. 11 Praxis-Tipp Leere Zeilen und Leerzeichen sollten zur Verbesserung der Lesbarkeit eines Programms eingesetzt werden. 2006 Pearson Education, Inc. All rights reserved. 2.2 Erstes Programm in C: Eine Zeile Text ausgeben 12 • Funktion main – Teil jedes C Programms • Genau eine Funktion jedes Programms muss den Namen main haben. – main gibt einen Wert vom Typ einer ganzen Zahl (einen ‘integer’ int) zurück. • Beispiel int main( void ) – Eine Funktion kann auch einen Wert von außerhalb entgegennehmen. • Das void in Klammern bedeutet, dass main keine Information von außen entgegennimmt. 2006 Pearson Education, Inc. All rights reserved. 2.2 Erstes Programm in C: Eine Zeile Text ausgeben 13 • Funktion main – Der ‘Körper’ jeder Funktion beginnt mit einer öffnenden geschweiften Klammer { . – Die zugehörige schließende geschweifte Klammer } beendet jede Funktion. – Das Paar von geschweiften Klammern und der Programmteil zwischen ihnen wird ‘Block’ genannt. • Anweisungen (‘statements’) – Weisen das Programm an, eine Aktion auszuführen – Alle Anweisungen enden mit einem Semikolon (;). 2006 Pearson Education, Inc. All rights reserved. 2.2 Erstes Programm in C: Eine Zeile Text ausgeben 14 • Ausgabefunktion printf – Das Argument von printf, d.h. die Zeichenkette zwischen den Anführungszeichen wird formatiert ausgegeben. – Beispiel printf( "Hello" ); – Die Zeichenkette Hello wird in den Standardausgabestrom eingefügt, d.h. auf dem Bildschirm dargestellt. • Escape Zeichen – Ein Zeichen, dem ein "\" (Backslash) vorangestellt ist • zeigt die Ausgabe eines ‘speziellen’ Zeichens an – Beispiel "\n" – Der Cursor wird zum Anfang der nächsten Zeile bewegt. 2006 Pearson Education, Inc. All rights reserved. 15 Escapesequenz Beschreibung \n Zeilenwechsel. Positioniert den Cursor am Anfang der nächsten Zeile. \t Horizontaler Tabulator. Bewegt den Cursor zum nächsten Tabulator-Stopp. \r Wagenrücklauf. Positioniert den Cursor am Anfang der aktuellen Zeile; wechselt dabei nicht zur nächsten Zeile. \a Alarm. Gibt ein Signal auf den Systemlautsprecher. \\ ‘Backslash’. Benutzt zur Ausgabe dieses Zeichens. \' Einfaches Anführungszeichen. Benutzt zur Ausgabe dieses Zeichens. \" Doppeltes Anführungszeichen. Benutzt zur Ausgabe dieses Zeichens. Fig. 2.2 | Escapesequenzen. 2006 Pearson Education, Inc. All rights reserved. 16 Praxis-Tipp Viele Programmierer nehmen als letztes Zeichen, das von einer Funktion ausgegeben wird, das newline-Zeichen (\n). Das stellt sicher, dass die Funktion den Bildschirmcursor am Beginn einer neuen Zeile hinterlässt. Konventionen dieser Art unterstützen die Wiederverwendung von Software – ein Hauptziel der Softwareentwicklung. 2006 Pearson Education, Inc. All rights reserved. 17 Häufiger Programmierfehler Weglassen des Semikolons am Ende einer C Anweisung ist ein Syntaxfehler. (Präprozessordirektiven enden nicht mit einem Semikolon.) Die Syntax einer Programmiersprache legt die Regeln für die Erzeugung eines gültigen Programms in dieser Sprache fest. Ein Syntaxfehler tritt auf, wenn der Compiler Code vorfindet, der die Sprachregeln von C verletzt. Der Compiler gibt eine Fehlermeldung als Hilfe für den Programmierer aus, um den fehlerhaften Code zu finden und zu korrigieren. 2006 Pearson Education, Inc. All rights reserved. 18 Häufiger Programmierfehler Syntaxfehler werden auch Compilerfehler, Übersetzungsfehler oder Fehler zur Übersetzungszeit genannt, weil der Compiler sie während der Übersetzungsphase aufdeckt. Eine Ausführung des Programms ist unmöglich, solange nicht alle Syntaxfehler korrigiert sind. 2006 Pearson Education, Inc. All rights reserved. 2.2 Erstes Programm in C: Eine Zeile Text ausgeben 19 •return Anweisung – Eine von verschiedenen Möglichkeiten, um eine Funktion zu beenden – Wird return am Ende von main eingesetzt, zeigt der Wert 0 eine erfolgreiche Beendigung des Programms an. – Beispiel return 0; – main ist die einzige Funktion, bei der die return Anweisung weggelassen werden darf, obwohl ein Rückgabetyp (int) für main erklärt wurde. Der Compiler ergänzt in diesem Fall automatisch die Anweisung return 0; 2006 Pearson Education, Inc. All rights reserved. 20 Portabilitäts-Tipp Im C-Standard ist für main der Rückgabetyp int festgelegt. Ein Rückgabetyp void ist nicht standardkonform und führt bei manchen C++Compilern (nicht bei MS Visual C++) zu einer Fehlermeldung. Ein Rückgabetyp void für main sollte deshalb nicht verwendet werden. Bei Verwendung des standardkonformen Rückgabetyps int ist es jedoch erlaubt, im Fall von main die sonst ( d.h. in allen anderen Funktionen) erforderliche return Anweisung wegzulassen. 2006 Pearson Education, Inc. All rights reserved. 21 Praxis-Tipp Der komplette Funktionskörper jeder Funktion sollte um eine Ebene (z.B. drei Leerstellen) innerhalb der umschließenden Klammern eingerückt werden. Das verdeutlicht die Struktur eines Programms und macht das Programm besser lesbar. 2006 Pearson Education, Inc. All rights reserved. 22 Praxis-Tipp Die Breite für eine Einrückungsebene sollte einmal festgelegt und dann einheitlich angewendet werden. Die Einrückung kann durch die Tabulatortaste erfolgen, dabei ist jedoch zu beachten, dass Tabulatorstopps in verschiedenen Anwendungen unterschiedlich sind. Besser ist es, z.B. drei Leerstellen für eine Einrückungsebene zu benutzen. Dies kann in den meisten Entwicklungsumgebungen (auch MS Visual C++) so eingestellt werden. 2006 Pearson Education, Inc. All rights reserved. 23 2.3 Varianten des ersten C Programms • Zwei Beispiele – Text in eine einzige Zeile durch mehrere Anweisungen ausgeben (Fig. 2.3) • Jede Ausgabe wird an genau der Stelle fortgesetzt, an der die vorherige aufgehört hat. – Text in mehrere Zeilen durch eine einzige Anweisung ausgeben (Fig. 2.4) • Jede Escapesequenz ‘Zeilenwechsel (\n)’ positioniert den Cursor an den Anfang der nächsten Zeile • Zwei aufeinanderfolgende Zeilenwechsel (\n\n) geben eine Leerzeile aus. 2006 Pearson Education, Inc. All rights reserved. 1 // Fig. 2.3: fig02_03.c 2 // Printing a line of text with multiple statements. 3 #include <stdio.h> // allows program to output data to the screen Outline 24 4 5 // function main begins program execution 6 int main( void ) 7 { 8 printf( "Welcome " ); 9 printf( "to C!\n" ); 10 11 Mehrere Ausgabeanweisungen ergeben eine Zeile Ausgabe fig02_03.c (1 von 1) return 0; // indicate that program ended successfully 12 13 } // end function main Welcome to C! 2006 Pearson Education, Inc. All rights reserved. 1 // Fig. 2.4: fig02_04.c 2 // Printing multiple lines of text with a single statement. 3 #include <stdio.h> // allows program to output data to the screen 4 5 // function main begins program execution 6 int main( void ) 7 { 8 Verwendung von Zeilenwechsel-Zeichen, um in mehrere Zeilen auszugeben printf( "Welcome\nto\n\nC!\n" ); Outline 25 fig02_04.c (1 von 1) 9 10 return 0; // indicate that program ended successfully 11 12 } // end function main Welcome to C! 2006 Pearson Education, Inc. All rights reserved. 2.4 Zweites C Programm: Ganze Zahlen addieren 26 • Variablen – Namen von Speicherplätzen, in denen Werte abgespeichert werden – Gebräuchliche Datentypen (‘fundamental’, ‘primitiv’ oder ‘eingebaut’) • int – ganze Zahlen • char – Zeichen • double – Zahlen mit Nachkommastellen – Variablen müssen mit Typ und Namen definiert werden, bevor sie benutzt werden können: int integer1; int integer2; int sum; 2006 Pearson Education, Inc. All rights reserved. 1 // Fig. 2.5: fig02_05.c 2 // Addition program that displays the sum of two numbers. 3 #include <stdio.h> // allows program to perform input and output Outline 27 4 5 // function main begins program execution 6 int main( void ) 7 { Definition von ganzzahligen Variablen 8 // variable declarations 9 int number1; // first integer to add 10 int number2; // second integer to add 11 12 int sum; // sum of number1 and number2 13 printf( "Enter first integer: " ); // prompt user for data 14 scanf( "%d", &number1 ); // read first integer from user into number1 fig02_05.c (1 von 1) Nutzung von scanf, um von der Standardeingabe (Tastatur) zu lesen 15 16 printf( "Enter second integer: " ); // prompt user for data 17 scanf( "%d", &number2 ); // read second integer from user into number2 18 19 sum = number1 + number2; // add the numbers; store result in sum 20 21 printf( "Sum is %d\n", sum ); // display sum 22 } // end function main Enter first integer: 45 Enter second integer: 72 Sum is 117 Das Zeichen %d im Formatstring gibt an, dass eine ganze Zahl (int) ausgegeben wird. 2006 Pearson Education, Inc. All rights reserved. 2.4 Zweites C Programm: Ganze Zahlen addieren 28 • Variablen – Mehrere Variablen des gleichen Typs können in einer einzigen Anweisung definiert werden. • Liste mit Kommas als Trennzeichen int number1, number2, sum; – Variablennamen • Gültige Bezeichner – Folge von Zeichen (Buchstaben, Ziffern, Unterstriche) – Dürfen nicht mit einer Ziffer beginnen – Unterscheiden zwischen Groß- und Kleinschreibung (‘Case sensitive’) 2006 Pearson Education, Inc. All rights reserved. 29 Praxis-Tipp Nach jedem Komma (,) sollte ein Leerzeichen gesetzt werden. Dies verbessert die Lesbarkeit von Programmen. Viele Programmierer ziehen es vor, jede Variable in einer eigenen Zeile zu deklarieren. Dies erlaubt auch, bei Bedarf einen erklärenden Kommentar zu der Variablen in den Rest der Zeile zu schreiben. 2006 Pearson Education, Inc. All rights reserved. 30 Portabilitäts-Tipp C erlaubt grundsätzlich Bezeichner beliebiger Länge, aber C Implementierungen begrenzen die Länge der Bezeichner. Benutzt man Bezeichner mit maximal 31 Zeichen, sollte die Portabilität sichergestellt sein. 2006 Pearson Education, Inc. All rights reserved. 31 Praxis-Tipp Bezeichner müssen so gewählt werden, dass sie eine Bedeutung innerhalb der Problemstellung des Programms haben (‘sprechende Bezeichner’). Dies hilft ein Programm selbsterklärend zu machen - man kann das Programm verstehen, indem man es einfach liest, statt auf Kommentare und Manuals angewiesen zu sein. 2006 Pearson Education, Inc. All rights reserved. 32 Praxis-Tipp Abkürzungen in Bezeichnern sollten vermieden werden. Dies erhöht die Lesbarkeit von Programmen. Bezeichner, die mit Unterstrichen oder doppelten Unterstrichen beginnen, sollten vermieden werden. C Compiler nutzen intern oft solche Namen. Auf diese Weise wird Verwirrung zwischen eigenen Namen und vom Compiler gewählten Namen vermieden. 2006 Pearson Education, Inc. All rights reserved. 2.4 Zweites C Programm: Ganze Zahlen addieren 33 • Eingabefunktion scanf – scanf liest von der Standardeingabeeinheit, dies ist normalerweise die Tastatur. – Beispiel: scanf( "%d", &number1 ); – scanf hat hier 2 Argumente: "%d" und &number1 – Das erste Argument, der Formatstring, bestimmt den Typ, den der Benutzer eingeben soll. – Das Umwandlungssymbol %d gibt an, dass eine ganze Zahl ( ‘decimal integer’) erwartet wird. – Das zweite Argument ist ein Variablenname, dem der ‘Adressoperator’ & vorangestellt ist. – scanf hat somit direkten Zugriff auf die Speicheradresse, an der sich die Variable, in die eingelesen werden soll, im Speicher befindet. 2006 Pearson Education, Inc. All rights reserved. 2.4 Zweites C Programm: Ganze Zahlen addieren 34 • Eingabefunktion scanf • Erwartet, dass der Benutzer einen Wert eingibt und die Eingabetaste drückt • Speichert den eingegebenen Wert – in dem Format, das als erstes Argument angegeben wird – in der Variablen, deren Adresse als zweites Argument angegeben wird. • Wandelt den Wert in den Typ der Variablen (wenn möglich) • Beispiel: scanf( "%d", &number1 ); – Liest eine mit der Tastatur eingegebene ganze Zahl zunächst als Folge von Zeichen – Wandelt die Zeichenfolge in eine ganze Zahl – Speichert die ganze Zahl in der Variablen number1 2006 Pearson Education, Inc. All rights reserved. 35 Häufiger Programmierfehler Vergisst man das ‘kaufmännische und’ & vor dem Variablennamen in einer scanf Anweisung, führt dies zu einem Laufzeitfehler. Auf vielen Systemen bedingt dies einen ‘Segmentierungsfehler’ oder eine ‘Zugriffsverletzung’. Ein solcher Fehler tritt auf, wenn ein Programm versucht auf Teile des Speichers zuzugreifen, für die es keine Zugriffsberechtigung besitzt. Die genaue Erklärung dieses Fehlers folgt in Kapitel 7. 2006 Pearson Education, Inc. All rights reserved. 36 Häufiger Programmierfehler Programme sollten die korrekte Eingabe aller Werte validieren, um zu verhindern, dass fehlerhaft eingegebene Informationen die Berechnungen im Programm beeinflussen. 2006 Pearson Education, Inc. All rights reserved. 37 Sicherheitsaspekte scanf_s und printf_s Anhang K des C11 Standards führt sicherere Versionen von printf und scanf ein mit den Namen printf_s und scanf_s. Anhang K ist optional, so dass nicht jeder C Anbieter ihn implementieren wird. Microsoft Visual Studio hat schon vor der Veröffentlichung des C11 Standards Versionen von printf_s und scanf_s implementiert und reagiert standardmäßig mit Warnungen bei Verwendung von scanf. Die Warnungen weisen darauf hin, dass scanf ‘deprecated’ – also veraltet – ist und dass man besser scanf_s einsetzen sollte. 2006 Pearson Education, Inc. All rights reserved. 38 Sicherheitsaspekte Es gibt grundsätzlich zwei Möglichkeiten, mit Visual C++’s scanf Warnungen umzugehen – die Verwendung von scanf_s statt von scanf oder das Deaktivieren der entsprechenden Warnungen. Für die Programmlistings im Vorlesungsskript wird aus Gründen der Übersichtlichkeit und möglichst breiten Einsetzbarkeit scanf und printf benutzt und entsprechend wird davon ausgegangen, dass die Warnungen deaktiviert sind. Um der zunehmenden Wichtigkeit von Sicherheitsaspekten bei der C-Programmierung Rechnung zu tragen, werden bei den von meiner Website herunterladbaren Quellcodedateien aller Listings scanf_s und printf_s und verwandte sicherere Funktionen verwendet. 2006 Pearson Education, Inc. All rights reserved. 39 Sicherheitsaspekte Die scanf Warnungen in Visual C++ können so deaktiviert werden: 1. Eingabe von Alt F7 um den Property Pages Dialog des Projekts aufzurufen. 2. Expandieren der Configuration Properties > C/C++ in der linken Spalte und Auswählen von Preprocessor. 3. In der rechten Spalte, am Ende des Wertes für Preprocessor Definitions, Einsetzen von ;_CRT_SECURE_NO_WARNINGS 4. OK zum Speichern der Änderung. Alternativ kann im Programmcode die Zeile #define _CRT_SECURE_NO_WARNINGS vor der Zeile #include <stdio.h> ergänzt werden. 2006 Pearson Education, Inc. All rights reserved. 40 Sicherheitsaspekte Arithmetischer Überlauf (Overflow) Figur 2.5 präsentierte ein Additionsprogramm für die Berechnung der Summe von zwei int Werten (Zeile 19) mit der Anweisung sum = number1 + number2; // assign total to sum Sogar für diese einfache Anweisung gibt es ein potentielles Problem: Bei der Addition der beiden ganzen Zahlen könnte ein Wert resultieren, der zu groß ist, um ihn in einer int Variablen abzuspeichern. Dies wird als ‘arithmetischer Überlauf’ bezeichnet und es kann zu undefiniertem Verhalten des Programms führen. 2006 Pearson Education, Inc. All rights reserved. 41 Sicherheitsaspekte Die Maximal- und Minimalwerte, die in einer int Variablen gespeichert werden können, sind in den Konstanten INT_MAX und INT_MIN enthalten, die im Header <limits.h> definiert sind. Für professionelle Programme gilt es als gute Praxis, sich vor der Durchführung von arithmetischen Berechnungen wie der in Zeile 19 von Fig. 2.5 zu überzeugen, dass kein arithmetischer Überlauf auftreten kann. Code, um das zu erreichen, wird auf der CERT Website www.securecoding.cert.org unter dem Stichwort “INT32-C” gezeigt. Dieser Code benutzt die Operatoren && (logisches UND) und || (logisches ODER), die in Kapitel 4 behandelt werden. 2006 Pearson Education, Inc. All rights reserved. 2.4 Zweites C Programm: Ganze Zahlen addieren 42 • Zuweisungsoperator = – Weist den Wert auf seiner rechten Seite der Variablen auf seiner linken Seite zu – Binärer Operator (zwei Operanden) – Beispiel: sum = variable1 + variable2; – Addition der Werte von variable1 und variable2 – Speichern des Resultats in sum 2006 Pearson Education, Inc. All rights reserved. 43 Praxis-Tipp Auf beiden Seiten eines binären Operators sollten Leerzeichen stehen. Das hebt den Operator hervor und macht das Programm besser lesbar. 2006 Pearson Education, Inc. All rights reserved. 2.4 Zweites C Programm: Ganze Zahlen addieren 44 • Ausgabe mit einem Formatstring – Die Funktion printf kann auch mit mehreren Argumenten aufgerufen werden, wobei das erste Argument ein Formatstring ist. • Getrennt durch ein Komma folgt als zweites Argument der Name der Variablen, die ausgegeben werden soll. – Beispiel printf( "Die Summe ist %d\n", sum ); – Gibt das Stringliteral "Die Summe ist " in den Ausgabestrom. – Danach wird die numerische Variable sum in eine Zeichenfolge umgewandelt und in den Ausgabestrom geschrieben. – Zum Schluss wird ein Zeilenwechsel ausgegeben. 2006 Pearson Education, Inc. All rights reserved. 45 2.5 Speicherkonzepte • Variablennamen – Entsprechen tatsächlichen Speicherplätzen • Jede Variable hat Name, Typ, Größe und Wert. – Wenn ein neuer Wert in der Variablen platziert wird, wird der alte Wert überschrieben. • In den Speicher schreiben ist ‘destruktiv’. • Für das Lesen von Variablen aus dem Speicher gilt dies nicht. – Beispiel sum = number1 + number2; – Wert von sum wird überschrieben – Werte von number1 und number2 bleiben intakt 2006 Pearson Education, Inc. All rights reserved. 46 Fig. 2.6 | Speicherplätze nach Berechnung und Abspeichern der Summe von number1 und number2. 2006 Pearson Education, Inc. All rights reserved. 47 2.6 Arithmetik • Arithmetische Operatoren + * Addition Subtraktion Multiplikation / Division Ganzzahlige Division schneidet Nachkommastellen ab 23 / 4 ergibt 5 % Modulo-Operator Gibt den Divisionsrest bei ganzzahliger Division zurück 23 % 4 ergibt 3 2006 Pearson Education, Inc. All rights reserved. 48 Häufiger Programmierfehler Der Versuch, den modulo-Operator ( % ) mit nichtganzzahligen Operanden zu benutzen, führt zu einer Fehlermeldung des Compilers. 2006 Pearson Education, Inc. All rights reserved. 49 2.6 Arithmetik • Gradlinige Anordnung – Erforderlich für arithmetische Ausdrücke in C – Alle Konstanten, Variablen und Operatoren erscheinen gradlinig hintereinander angeordnet. • Gruppierung von Unterausdrücken – Klammern werden in C-Ausdrücken verwendet, um Unterausdrücke zu gruppieren. • Gleiche Vorgehensweise wie in algebraischen Ausdrücken – Beispiel a * ( b + c ) – Multipliziere a mit dem Wert von b + c 2006 Pearson Education, Inc. All rights reserved. 50 Operation arithmetischer Operator in C Algebraischer Ausdruck C Ausdruck Addition + f+7 f + 7 Subtraktion - p–c p - c Multiplikation * bm oder b· m b * m Division / x / y oder Modulo % r mod s x oder x : y y x / y r % s Fig. 2.7 | Arithmetische Operatoren. 2006 Pearson Education, Inc. All rights reserved. 51 2.6 Arithmetik • Regeln für den Operatorvorrang – Operatoren in Klammern werden zuerst ausgewertet. • Geschachtelte Klammern – Operatoren im innersten Klammernpaar zuerst – Als nächstes werden Multiplikation, Division, Modulo angewendet. • Die einzelnen Operatoren werden von links nach rechts angewendet. – Zum Schluss kommen Addition und Subtraktion. • Die einzelnen Operatoren werden von links nach rechts angewendet. 2006 Pearson Education, Inc. All rights reserved. 52 Operator(en) Operation(en) Reihenfolge der Auswertung (Vorrang) ( ) Klammern * / Multiplikation % Modulo + - Addition Subtraktion Division Zuerst ausgewertet. Bei geschachtelten Klammern wird der Ausdruck im innersten Klammerpaar zuerst ausgewertet. Mehrere nicht geschachtelte Klammerpaare werden von links nach rechts ausgewertet. Als Zweites ausgewertet. Wenn mehrere vorhanden sind, werden sie von links nach rechts ausgewertet. Zum Schluss ausgewertet. Wenn mehrere vorhanden sind, werden sie von links nach rechts ausgewertet. Fig. 2.8 | Vorrang von arithmetischen Operatoren. 2006 Pearson Education, Inc. All rights reserved. 53 Häufiger Programmierfehler Einige Programmiersprachen verwenden die Operatoren ** oder ^ um Exponentiation auszudrücken. C unterstützt diese Exponentiationsoperatoren nicht; der Versuch ihrer Verwendung führt zu einer Fehlermeldung. 2006 Pearson Education, Inc. All rights reserved. 54 Praxis-Tipp Der Einsatz von redundanten Klammern in komplexen arithmetischen Ausdrücken kann die Ausdrücke klarer machen. 2006 Pearson Education, Inc. All rights reserved. 2.7 Fallunterscheidungen: Vergleichsoperatoren 55 • Bedingung – Ausdruck, der entweder wahr (1) oder falsch (0) sein kann – Kann mit Hilfe von Vergleichs- und Gleichheitsoperatoren formuliert werden •if Anweisung – Falls die Bedingung wahr ist, wird der Körper der if Anweisung ausgeführt. – Falls die Bedingung falsch ist, wird der Körper der if Anweisung nicht ausgeführt. 2006 Pearson Education, Inc. All rights reserved. 56 Algebraischer Vergleichsoperator C Vergleichs- C Bedeutung der operator Bedingung C Bedingung Vergleichsoperatoren > x > y x ist größer als y < x < y x ist kleiner als y >= x >= y x ist größer als oder gleich y Gleichheitsoperatoren <= x <= y x ist kleiner als oder gleich y = == x == y x ist gleich y ≠ != x != y x ist ungleich y Fig. 2.9 | Vergleichs- und Gleichheitsoperatoren. 2006 Pearson Education, Inc. All rights reserved. 57 Häufiger Programmierfehler Einen der Operatoren ==, !=, >= und <= mit Leerzeichen zwischen seinen beiden Zeichen zu schreiben ist ein Syntaxfehler. 2006 Pearson Education, Inc. All rights reserved. 58 Häufiger Programmierfehler Die Reihenfolge der beiden Zeichen in einem der Operatoren !=, >= und <= zu vertauschen (also =!, => und =< zu schreiben) ist normalerweise ein Syntaxfehler. Es kann vorkommen, dass != als =! zu schreiben nicht zu einem Syntaxfehler führt, in aller Regel dann aber zu einem logischen Fehler, der sich bei der Ausführung des Programms auswirkt. 2006 Pearson Education, Inc. All rights reserved. 59 Häufiger Programmierfehler Die Verwechslung des Gleichheitsoperators == mit dem Zuweisungsoperator = ist ein typischer Anfängerfehler. Der Gleichheitsoperator sollte als “ist gleich zu” gelesen werden und der Zuweisungsoperator sollte als “wird zu” oder “bekommt den Wert von” gelesen werden. 2006 Pearson Education, Inc. All rights reserved. 1 // Fig. 2.13: fig02_13.c 2 // Comparing integers using if statements, relational operators 3 // and equality operators. 4 #include <stdio.h> // allows program to perform input and output 5 6 // function main begins program execution 7 int main( void ) 8 { fig02_13.c (1 von 2) 9 int number1; // first integer to compare 10 int number2; // second integer to compare 11 12 printf( "Enter two integers to compare: " ); // prompt user for data 13 scanf( "%d%d", &number1, &number2 ); // read two integers from user 14 15 16 if( number1 == number2 ) printf( "%d is equal to %d\n", number1, number2 ); 17 18 19 if( number1 != number2 ) Outline 60 Falls die Bedingung 1 ist (d.h., die Werte sind gleich), wird diese Anweisung ausgeführt printf( "%d is not equal to %d\n", number1, number2 ); 20 21 22 if( number1 < number2 ) printf( "%d is less than %d\n", number1, number2 ); 23 24 25 if( number1 > number2 ) printf( "%d is greater than %d\n", number1, number2 ); 2006 Pearson Education, Inc. All rights reserved. 26 27 28 if( number1 <= number2 ) printf( "%d is less than or equal to %d\n", number1, number2 ); Outline 61 29 30 31 if( number1 >= number2 ) printf( "%d is greater than or equal to %d\n", number1, number2 ); 32 } // end function main Enter two integers to compare: 3 7 3 is not equal to 7 3 is less than 7 3 is less than or equal to 7 Enter 22 is 22 is 22 is two integers not equal to greater than greater than fig02_13.c (2 von 2) to compare: 22 12 12 12 or equal to 12 Enter two integers to compare: 7 7 7 is equal to 7 7 is less than or equal to 7 7 is greater than or equal to 7 2006 Pearson Education, Inc. All rights reserved. 62 Praxis-Tipp Die Anweisung(en) im Körper einer if Anweisung sollten eingerückt werden, um die Lesbarkeit zu verbessern. Aus Gründen der Lesbarkeit sollte nicht mehr als eine Anweisung in einer Programmzeile stehen. 2006 Pearson Education, Inc. All rights reserved. 63 Häufiger Programmierfehler Ein Semikolon direkt nach der rechten Klammer der Bedingung einer if Anweisung ist meist ein logischer Fehler (jedoch kein Syntaxfehler!). Das Semikolon bewirkt, dass der Körper der if Anweisung leer ist, so dass die if Anweisung unabhängig von ihrer Bedingung keine Aktion ausführt. Die ursprünglich im Körper der if Anweisung stehende Anweisung wird danach auf alle Fälle ausgeführt, so dass das Ergebnis unabhängig von der if Bedingung wird. 2006 Pearson Education, Inc. All rights reserved. 64 Praxis-Tipp Eine lange Anweisung kann über mehrere Zeilen verteilt werden. In diesem Fall sollten sinnvolle Trennstellen, wie hinter einem Komma in einer kommagetrennten Liste, oder nach einem Operator in einem langen Ausdruck, gewählt werden. Alle so entstehenden Folgezeilen sollten auf die gleiche Weise eingerückt werden. 2006 Pearson Education, Inc. All rights reserved. 65 Operator Assoziativität Typ () von links nach rechts Klammern von links nach rechts multiplikativ * / + - von links nach rechts additiv << >> von links nach rechts Aus-/Eingabe < <= == != = % > >= von links nach rechts Vergleich von links nach rechts Gleichheit von rechts nach links Zuweisung Fig. 2.14 | Vorrang und Assoziativität der bisher besprochenen Operatoren. 2006 Pearson Education, Inc. All rights reserved. 66 Praxis-Tipp Vorrang und Assoziativität von Operatoren können in der entsprechenden Tabelle nachgesehen werden. Bei Unsicherheit über die Auswertungsreihenfolge in einem komplexen Ausdruck sollte der Ausdruck in kleinere Anweisungen zerlegt oder zusätzliche Klammern verwendet werden. Zuweisungsoperatoren (=) sind im Gegensatz zu den meisten anderen Operatoren rechtsassoziativ. 2006 Pearson Education, Inc. All rights reserved.