2017-05-11 3 views
-2
#include <stdio.h> 
#define test(x) x*x 
#define test2(x) x 
int main(void) {  
int x=5; 
printf("%d %d %d %d %d %d",test2(x), test2(x-2), test(x), test(x-2),4*(test(x-3)),4*test(x-3)); 
return 0; 
} 

Dies gibt die Ausgabe als:C# define seltsame Ausgänge

5 3 25 -7 -52 2

Nun kann für erste 3 verstehen, aber warum -7, wenn Test (x-2) und letzten 2 ...

+2

Was ist x-2 * x-2? – immibis

+1

'#define test (x) (x) * (x)' – Abhineet

Antwort

3

nach Compiler Vorverarbeitung Ihre printf Schritt wird

printf("%d %d %d %d %d %d",x, x-2, x*x, x-2*x-2,4*(x-3*x-3),4*x-3*x-3); 

x-2 * x-2 wird als: x-2 * x-2 -> x- (2 * x) -2

5-10-2

= -7

dh * hat Vorrang vor -

+0

Erwähnen Sie * Präprozessor * und unterscheiden Sie diese von der folgenden C-Kompilierung, und diese Antwort wird wesentlich vollständiger sein. Ein Vorschlag, die Ausdrucksgebräuche mit Parens zu umgeben und wie sich das Verhalten ändert, wäre ebenfalls stellar. – WhozCraig

1

Ihre Dieser Ausdruck erweitert etwas, wie es im zweiten Code-Snippet angegeben ist: Im folgenden Code ist eingerückt, um Ihnen den Code einfach zu zeigen, ich weiß, dass er syntaktisch falsch ist. :)

printf("%d %d %d %d %d %d",test2(x), 
          test2(x-2), 
          test(x), 
          test(x-2), 
          4*(test(x-3)), 
          4*test(x-3)); 

Nach der Expansion:

printf("%d %d %d %d %d %d",x, 
          x-2, 
          x*x, 
          x-2*x-2, 
          4*(x-3*x-3), 
          4*x-3*x-3); 

Makros nicht Ausdruck ersetzt mit Klammern aktiviert, sondern macht es den wörtlichen Ersatz.

Wenn Sie die Mathematik machen, erhalten Sie die Antwort, die Sie bereits oben angezeigt hatten.