Lokale Variablen und die Zuweisung in C
main.c
#include <stdio.h>
int main( void )
{ int v = 12;
printf( "%d\n", v );
v = -9;
printf( "%d\n", v ); }stdout
12
-9
Die Nachkommastellen werden abgeschnitten (es wird nicht etwa gerundet).:
main.c
#include <stdio.h>
int main( void )
{ int v = 1;
printf( "%d\n", v );
v = 2.99;
printf( "%d\n", v ); }stdout
1
2main.c
#include <stdio.h>
int main( void )
{ int v;
v = -9;
printf( "%d\n", v ); }stdout
-9
main.c
#include <stdio.h>
int main( void )
{ int v; printf( "%d\n", v ); }main.c
#include <stdio.h>
int main( void )
{ int v = 12;
printf( "%d\n",( v = 14.5 )+ 1 );
printf( "%d\n", v ); }stdout
15
14main.c
#include <stdio.h>
int main( void )
{ int a = 2;{ a = 4;
int a = 6;
a = 8;
printf( "%d\n", a ); }printf( "%d\n", a ); }
Protokoll
8
4
Ein Objekt ist eine Speicherzelle, die Daten eines bestimmten Typs aufnehmen kann.
Ein int-Objekt ist beispielsweise eine Speicherzelle, die eine int-Zahl aufnehmen kann.
Eine Variable ist praktisch eine Kombination eines Objektes mit einem Namen und einem Typ. (Dieser Typ ist derselbe Typ wie der Typ des Objektes, aber er ist außerdem auch der Implementation bekannt.)
Bei einer Definition einer Variablen wird ein neues Objekt angelegt und die Variable an jenes Objekt gebunden, der Name der Variablen steht dann innerhalb des Gültigkeitsbereichs der Definition für jenes Objekt.
Bei einer Initialisierung eines Objektes wird zum ersten Mal ein Wert in jenes Objekt geschrieben.
Eine Zuweisung ist ein Ausdruck, der mit dem Operator »=« geschrieben wird. Das Vorkommen des Zeichens »=« in einer Definition zur Initialisierung des Definierten gilt aber nicht als eine Zuweisung, sondern als eine Initialisierung.
Veränderbare Variablen bieten gegenüber Konstanten noch zusätzliche Möglichkeiten: sie stehen nicht für einen Wert, sondern für einen Speicherplatz, der einen Wert des Typs der Variablen aufnehmen kann. Dieser Wert kann sich während der Ausführung des Blocks der Variablen ändern. (Wir werden etwas später sehen, wie genau dies möglich ist.) Jedoch ist der Typ einer Variablen immer konstant, sowohl bei einer Konstanten als auch bei einer veränderbaren Variablen.
Undefiniertes Verhalten
Ein Programm, in dem
- zwei Schreibzugriffe auf ein Objekt stattfinden oder
- ein Schreibzugriff und ein Lesezugriff auf ein Objekt stattfinden,
für die es keine festgelegte zeitliche Reihenfolge gibt, hat undefiniertes Verhalten.
Die zeitliche Reihenfolge der Auswertung von Argumenten einer Funktion ist in C nicht festgelegt.
- Undefiniertes Verhalten
printf( "%d %d\n", a = a + 1, a = a + 1 );
printf( "%d %d\n", a = a + 1, a );
Zur Korrektur dieses Fehlers kann man die Ausdrücke auf mehrere Anweisungen aufteilen. Die Reihenfolge der Ausführung der Anweisungen in einem Block ist in C festgelegt.
- Vermeidung des undefinierten Verhaltens
printf( "%d ", a = a + 1 ); printf( "%d\n", a = a + 1 );
printf( "%d ", a = a + 1 ); printf( "d\n", a );
- Zitat *
If a side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined. If there are multiple allowable orderings of the subexpressions of an expression, the behavior is undefined if such an unsequenced side effect occurs in any of the orderings.
- Zitat *
The side effect of updating the stored value of the left operand is sequenced after the value computations of the left and right operands.
Übungsfragen
Wie schreibt man eine Anweisung, welche den Wert einer int-Variablen v um 7 erhöht?
Wie bei allen Übungsaufgaben sollten auch hier nur die bisher im Kurs vorgestellten Sprachelemente verwendet werden.
Was muß man in das folgende Programm an der Stelle von »/* ... */« einsetzen, um die Werte von x und y zu vertauschen (so daß dann nicht mehr »22, 47«, sondern »47, 22« ausgegeben wird)?
main.c
#include <stdio.h>
int main( void )
{ int x = 22;
int y = 47;/* ... */
printf( "%d\n", x );
printf( "%d\n", y ); }stdout
22
47