Symbolische Konstante in einem Programm mit Schleife
-
hallo,
damit ich ein wenig den umgang mit symbolischen Konstanten übe, habe ich folgenden code geschrieben:
#include <stdio.h> #include <stdlib.h> #define CNT 10 int main(void) { int i; #undef CNT #define CNT 5 for(i = 0; i < CNT; i++){ #undef CNT #define CNT 20 printf("%d\n", i ); } return EXIT_SUCCESS; }
meine frage ist, wieso die schleife nur 5 mal und nicht 20 mal durchlaufen wird?
denn durch das #undef CNT innerhalb der Schleife müsste doch 5 aufgehoben und mit #define CNT 20 durch die 20 ersetzt werden, aber anscheinend funktioniert das nicht. kann mir jmd. sagen wieso das so ist? ich finds bissl komisch...
-
Der Preprozessor (der ist für die #-Befehle da) macht reinen Textersatz vor dem eigentlichen compilieren.
Für den Compiler steht dann dafor(i = 0; i < 5; i++){
-
Symbolische Konstanten werden noch vor der Compilezeit vom Präprozessor ausgewertet, lange bevor Schleifen & Co eine Rolle spielen. Der Präprozessor führt ganz stupide Textersetzungen durch (wichtiges Detail: Er benutzt lazy-evaluation) und geht dabei auch nur einmal durch den Quelltext, d.h. dein Compiler sieht von deinem Code nur:
// Hier steht der ganze Inhalt der stdio.h // Hier steht der ganze Inhalt der stdlib.h int main(void) { int i; for(i = 0; i < 5; i++){ // Hier hat der Präprozessor CNT durch 5 ersetzt printf("%d\n", i ); } return 0; // Hier hat der Präprozessor EXIT_SUCCESS durch 0 ersetzt }
(Genau genommen würde der Präprozessor auch noch die Kommentare entfernen und eventuell ein paar Infos für den Compiler einfügen, das ist hier nicht wichtig)
-
Du könntest dir den Output des Compilers nach dem Preprozessor abfangen, dann wäre es sofort ersichtlich. Das sähe dann in etwa so aus:
int main(void) { int i; for(i = 0; i < 5; i++){ printf("%d\n", i ); } return 0; }
-
ok, danke. habs jetzt verstanden.