2016-04-27 5 views
1

Ich habe eine kleine Frage über die Präprozessor-Konstanten in C. Ich verstehe, was das Ziel dieser Art von "Variable" ist und wie es funktioniert. Ich habe jedoch eine kleine Frage zu ihrer Bewertung. Lassen Sie uns ein kleines Beispiel betrachten:Präprozessor-Konstante Auswertung

#define MY_VARIABLE 5 

int main() { 
    int test1 = MY_VARIABLE*5; 
    int test2 = 5; 
    int test3 = MY_VARIABLE*test2; 
} 

Während der Präprozessor Schritt wird MY_VARIABLE von 5 im Code ersetzt werden. Meine Frage ist: wird test1 während der Kompilierung oder während der Ausführung berechnet? Stimmt das, dass test3 während der Ausführung berechnet wird? Diese Frage mag ein bisschen seltsam und nutzlos erscheinen, aber ich studiere ein Programm, bei dem solche Dinge oft gemacht werden, und ich würde gerne wissen, ob diese Art von Operationen die Ausführung verlangsamen kann.

+0

Test1) Initialwert ist keine Bewertung zum Zeitpunkt der Ausführung. test3) initial value wird bei der Ausgabe des Codes keine Auswertung zum Zeitpunkt der Ausführung durch Rückschluss erfolgen. – BLUEPIXY

+0

Lass uns sagen, Berechnung dann :) – user1382272

+0

Eigentlich ist Ihre Frage überhaupt nicht über _precprocessor Konstante Evaluierung_, –

Antwort

1

Wie Sie bereits verstanden haben, ersetzt der C-Präprozessor lediglich die Makros, bevor die eigentliche Kompilierung stattfindet, daher habe ich alle Präprozessor-bezogenen Daten entfernt.

In diese Code keine Auswertung während der Ausführung nimmt, da der Compiler 5 berechnet * 5 während der Kompilierung und durch Folgerung ist, kann auch alle anderen Konstanten während der Kompilierung bewerten:

int main() { 
    int test1 = 5 * 5; 
    int test2 = 5; 
    int test3 = 5 * test2; 
} 

Die genaue Äquivalent der Codefragment vorhergehenden ist:

int main() { 
    int test1 = 25; 
    int test2 = 5; 
    int test3 = 25; 
} 

Aber in folgendem Code test3 wird während der Laufzeit ausgewertet, da der Wert von test2 nicht davon abhalten werden kann Während der Kompilierzeit wird der Wert ermittelt, da er vom Rückgabewert SomeFunction abhängt, der nur zur Laufzeit bekannt sein kann.

int main() { 
    int test1 = 5 * 5; 
    int test2 = SomeFunction();   
    int test3 = 5 * test2; 
} 
+2

Beachten Sie, dass der Wert für "test3" auch während der Ausführung abhängig von den Optimierungseinstellungen des Compilers berechnet werden kann. Bei Debugging-Einstellungen ist es nicht unüblich, dass der 'test3'-Wert beim Debuggen berechnet wird. – atturri

+0

Vielen Dank! Ich habe noch einen: sagen wir mal test3 = MY_VARIABLE + j; wobei j eine Variable ist, die bei jeder Schleifeniteration aktualisiert wird. Wird es bei der Übersetzung auch berechnet, wenn die Optimierung eingestellt ist? – user1382272

+0

@atturri das kann wahr sein, zum Beispiel wenn 'SomeFunction' eine Konstante zurückgibt. –