Grundelemente der C Programmierung - fbi.h

Werbung
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.
Zugehörige Unterlagen
Herunterladen