Lokale Variablen und die Zuweisung in C (Lokale Variablen und die Zuweisung in C), Lektion, Seite 722912
https://www.purl.org/stefan_ram/pub/variablen_c (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram

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
2
main.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
14
main.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

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

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram722912 stefan_ram:722912 Lokale Variablen und die Zuweisung in C Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd722912, slrprddef722912, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/variablen_c