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%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.
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.
Sie müssen Ihr Makro mit isolierenden Klammern wie folgt definieren:
%Vor%Sonst
%Vor%wird zu
erweitert %Vor%Wenn du willst, ist
%Vor%Dies verhindert fehlerhafte Erweiterungen wie:
%Vor%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%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%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%Tags und Links c