printf und Variablen
-
Hallo!
Beim Herumexperimentieren bin ich auf ein für mich noch unerklärliches Phänomen gestoßen. Zunächst sollte ich erwähnen, daß ich ein absoluter C-Neuling bin.
Zur Veranschaulichung habe ich ein kleines Testprogramm erstellt:
/* test */ int a=1, b=2; #include <stdio.h> void test1(void) { printf("\ndas ist die 1. Zahl:\n%i\n\nund das ist die 2. Zahl:\n%i\n", a, b); } void test2(void) { printf("\ndas sollte die 1. Zahl sein:\n%i\n\nund das die 2. Zahl:\n%i\n", a, a++); } void test3(void) { printf("\ndas sollte die 1. Zahl sein:\n%i\n\nund das die 2. Zahl:\n%i\n", b--, b); } void test4(void) { int c=2; printf("\ndas sollte die 1. Zahl sein:\n%i\n\nund das die 2. Zahl:\n%i\n\n", c--, c); } void main(void) { test1(); test2(); test3(); test4(); }
Der Wert der ersten Zahl ist 1 und der Wert der Zweiten ist 2. Am Ausgabetext sieht man, was für eine Zahl ich erwarten würde, und darunter wird die tatsächliche Zahl angezeigt.
Nach dem Programmaufruf erscheint folgendes auf dem Bildschirm:
**`
das ist die 1. Zahl:
1
und das ist die 2. Zahl:
2
das sollte die 1. Zahl sein:
2
und das die 2. Zahl:
1
das sollte die 1. Zahl sein:
2
und das die 2. Zahl:
2
das sollte die 1. Zahl sein:
2
und das die 2. Zahl:
1
`**
Nun zu meinen Fragen:
Kann mir jemand erklären, warum(1)
...bei der Prozedur test2 a++ die erste Zahl ist und a zur 2. Zahl wird? (Ein Test hat mir gezeigt, daß die globale Variable a nach beendigung der Prozedur incrementiert war.)(2)
...bei test3 beide Zahlen b sind? (Wiederum hat ein Test gezeigt, daß auch hierbei nach Beendigung der Prozedur die globale Variable b dekrementiert war.)und (3)
...es einen Unterschied bei der printf-Funktion gibt, wenn man die Variable, wie in der Prozedur test4, nicht global, sondern lokal definiert?Natürlich ist mir klar, daß dies kein wirkliches Problem darstellt, da man ja schließlich durch eine kleine Modifikation des Programmes doch zum richtigen Ergebnis kommt; aber ich als Programmierer hätte halt doch schon gerne gewußt, warum sich ein von mir erstelltes Programm nicht so verhält, wie ich es eigentlich erwarten würde - und nicht nur daß es sich einfach anders verhält.
Bei allen, die mir einleuchtende Antworten und Erklärungen liefern, möchte ich mich schon jetzt ganz herzlich bedanken.
Gruß
Euer Seemann
-
Die Auswertungsreihenfolge bei variablen Argumentlisten ist implementierungsabhängig, d.h. deine Versuche kannst du in die Tonne treten.
(Liebe Kinder, nicht nachmachen).
Es macht dabei keinen Unterschied, ob diese Variablen lokal oder global sind.
Nur Deppen benutzen globale Variablen.