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 da

    for(i = 0; i < 5; i++){
    

  • Mod

    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.


Anmelden zum Antworten