Wie funktioniert der Präprozessor in C?

7

Warum lautet die Antwort für den folgenden Code 16? Kann jemand die Funktionsweise dieses Programms erklären?

%Vor%

Wenn wir den gleichen Code wie unten schreiben, lautet die Antwort 4:

%Vor%     
Arvind Lairenjam 30.01.2013, 13:16
quelle

9 Antworten

0

erhalten Sie

%Vor%     
Johann Gerell 30.01.2013, 13:20
quelle
16

Der Präprozessor ersetzt den Text genau so, wie er geschrieben wurde.

So wird der Makroaufruf SQUARE(2) buchstäblich 2*2 .

In Ihrem Fall bedeutet das, dass der gesamte Ausdruck 16/2*2 wird, was wegen Cs Vorrangregeln ausgewertet wird zu (16/2) * 2, dh 16.

Makros sollten immer in Klammern stehen und jedes Argument muss ebenfalls eingeschlossen sein.

Wenn wir das tun, erhalten wir:

%Vor%

ersetzt 16/((2) * (2)) , was zu 16/4, d. h. 4.

, führt

Die Parens um jedes Argument lassen Dinge wie SQUARE(1+1) funktionieren wie erwartet, ohne sie würde ein Aufruf wie 16/SQUARE(1+1) 16/(1+1*1+1) werden, was 16/3 ist, dh überhaupt nicht das, was du willst.

    
unwind 30.01.2013 13:21
quelle
3

Reihenfolge der Vorgänge. Dein Ausdruck bewertet Folgendes:

%Vor%

was gleich 16 ist. Machen Sie es:

%Vor%

, wodurch das Quadrat zuerst ausgewertet wird.

    
CJ_912 30.01.2013 13:19
quelle
3

Sie müssen Ihr Makro mit isolierenden Klammern wie folgt definieren:

%Vor%

Sonst

%Vor%

wird zu

erweitert %Vor%

Wenn du willst, ist

%Vor%     
Mitch Wheat 30.01.2013 13:18
quelle
3

1. Wenn Sie Makros verwenden, die als Ausdrücke verwendet werden sollen, sollten Sie den gesamten Makrokörper in Klammern setzen.

Dies verhindert fehlerhafte Erweiterungen wie:

%Vor%

2. Wenn die Makroargumente Ausdrucke sind, sollten Sie sie auch in Klammern setzen.

Dies verhindert eine andere Art von Problemen:

%Vor%

Daher ist es richtig, es so zu schreiben:

%Vor%

Es wird jedoch davon abgeraten, Makros als Funktionen zu verwenden (rate warum), also benutze stattdessen eine Funktion. Zum Beispiel:

%Vor%     
Kos 30.01.2013 13:21
quelle
2

Die Erweiterung des Makros wird wie folgt aussehen:

%Vor%

Was gleich ist: j = (16/2)*2; Bedeutet j = 16;

und:

%Vor%

Was gleich ist: j = 16/4; Bedeutet j = 4;

    
Midhun MP 30.01.2013 13:19
quelle
2

Weil das Makro wie folgt erweitert wird:

%Vor%

Der Pre-Compiler führt keine Verarbeitung für die Erweiterung durch. Es platziert das erweiterte Makro in Ihrem Code wie es ist. Da Sie den Ersatztext nicht geklammert haben, wird er auch im Hauptcode nicht für Sie verwendet. Mach es:

%Vor%     
Deepankar Bajpeyi 30.01.2013 13:19
quelle
1

Das erste Beispiel wird wie folgt ausgewertet:

%Vor%

Das zweite Beispiel wird wie folgt ausgewertet:

%Vor%

Fügen Sie der Präprozessoranweisung eine Klammer hinzu, um die Reihenfolge der Operationen zu steuern:

%Vor%

Die äußere Klammer in ((n) * (n)) stellt sicher, dass n quadriert wird, bevor eine äußere Operation ausgeführt wird. Die innere Klammer (n) stellt sicher, dass n in Fällen korrekt ausgewertet wird, in denen Sie einen Ausdruck wie folgt an SQUARE übergeben:

%Vor%     
Nocturno 30.01.2013 13:22
quelle
0
%Vor%     
Ganesh 30.01.2013 15:44
quelle

Tags und Links