2012-03-26 14 views
3

Ich habe das folgende C-Programm geschrieben. Die Ausgabe ist 32. Warum ist das?Ausgabe eines C-Programms

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#define max 10+2 

int main(){ 
    int i; 
    i = max * max; 
    printf("\n%d\n",i); 

    return 0; 
} 

(I C lerne und bin relativ neu zu.)

+1

Hilft es, wenn ich dir sage, dass das, was der Compiler tatsächlich sieht, ist "' i = 10 + 2 * 10 + 2; '"? – zwol

Antwort

6
#define max 10+2 

Dies ist der Prä-Prozessor ist. es ist nicht schlau.

ist es dumm.

es ersetzt nur Text.

max*max 

wird

10+2*10+2 

lösen, die wegen Operatorpräzedenz

10+(2*10)+2 

ist, die

10 + 20 + 2 

heißt 32

ist

Darüber hinaus sollten Sie Preprozessor-Makros wann immer möglich vermeiden und static const statt verwenden. Vielleicht möchten Sie auch eine const Variable oder eine enum anstelle einer #define verwenden; Jeder haben ihre Kompromisse, beziehen sich auf die ähnliche Frage: "static const" vs "#define" vs "enum".

Wenn Sie Präprozessor bleiben möchten, dann können Sie nur verwenden:

#define max (10+2) 

Da parenthesised Code Operator precendence nehmen.

+4

Die letzte Zeile ist ein schlechter Ratschlag. In C ist eine statische const-Variable in jeder Hinsicht schlechter (als Konstante) als ein Präprozessor-Makro. Das Problem wird einfach gelöst, indem dem Makro die richtigen Klammern hinzugefügt werden. –

+0

@R .. können Sie bitte erklären, warum es schlimmer ist. –

+0

Das Größte ist, dass es kein konstanter Ausdruck ist, deshalb kann es nicht in Kontexten verwendet werden, in denen ein konstanter Ausdruck benötigt wird - nicht einmal als Initialisierer für andere "statische const" Objekte. –

1

Der Compiler sieht dies

i = 10 + 2*10 +2 = 32 

Sie sollte wie folgt

#define max (10+2) 
2

die Makrodefinition tun Da max ein Makro ist, wird es textuell erweitert, sodass Ihr Code folgendermaßen ausgegeben wird:

i = 10 +2 * 10 + 2; 

Für ein Makro wie diese, möchten Sie in der Regel Klammern hinzuzufügen:

#define max (10+2) 

Also Ihr Ausdruck wird erweitert zu:

i = (10+2) * (10+2); 
0

Operator Vorrang ist eine lustige Sache. PEMDAS = Elternteile, Exponenten, Multiplizieren, Teilen, Addieren, Subtrahieren.

Das wird sich gleich 10 + (2 * 10) + 2. Zunächst ist 10 * 2, die 20

Jetzt gleich lösen es 10 liest + 20 + 2. Der Rest sollte klar.

Sie sollten die Kontrolle über Ihre Arithmetik wann immer gewünscht ausüben.

+0

PEMDAS gilt nicht wirklich in C. Zum Beispiel, '3 << 1 + 2' ergibt 24, statt 8. –

+0

Vergessen Sie in der Tat PEMDAS, es wird Ihnen in C nicht gut tun. Nehmen Sie dieses obskure aber gültige Beispiel 'a * = - ++ b/c;'. Subtrahieren, dann hinzufügen, dann teilen, dann multiplizieren. – Lundin