2016-05-19 21 views
2

Ich denke, ich werde verrückt. Ich lerne C-Vorprozessor und ich kann dieses Problem nicht herausfinden, I definiert SQR (X) (X * X) absichtlich ohne KlammernC-Präprozessor #define SQR (x) (x * x)

#include <stdio.h> 
#define SQR(x) (x * x) 
int main() 
{ 
    int counter; /* counter for loop */ 
    for(counter = 0; counter < 5; ++counter) 
    { 
     printf("x %d, x squared %d\n",counter+1, SQR(counter+1)) 
    } 
    return (0); 
} 

in einem Moment in Schleifenzähler = 3. Dann sollte es sein 3 + 1 * 3 + 1 und das ist gleich 7, aber die Ausgabe sagt 5. Hier Ausgabe des Codes oben:

x 1, x squared 1 
x 2, x squared 3 
x 3, x squared 5 
x 4, x squared 7 
x 5, x squared 9 

Process returned 0 (0x0) execution time : 0.020 s 
Press any key to continue. 

ich eindeutig etwas fehlt bin, aber ich kann es nicht verstehen aus.

+2

Sie haben richtig, es ist 7. Sie drucken Zähler mit einem hinzugefügt, so dass Ihre Antworten nicht übereinstimmen. – LogicG8

+0

Wenn Sie 'x 3' drucken, ist' counter' '2'. – user2357112

+0

Ja, aber der Druck sagt deutlich: "x 3, x quadriert 5" so im Einsatz vergleichen + 1 zu drucken und dann +1 zu calc. Gleicher Wert – honeyPot

Antwort

4

Wenn Zähler = 3, wird als gedruckt, weil Sie counter+1 drucken. Verwendung:

printf("x %d, x squared %d\n",counter, SQR(counter+1)); 

, um zu sehen, was der tatsächliche Wert des Zählers ist.

+1

Yeap, dumm mir danke ... – honeyPot

+0

Immer noch falsch. –

+0

@CareyGregory OP erklärte, dass er über dieses Problem Bescheid weiß und er "SQR (x * X) absichtlich ohne Klammern definiert" – squill25

0

Abgesehen von dem offensichtlichsten Fehler, der in Ignaus 'Antwort aufgezeigt wurde, haben Sie hier einen zweiten, heimtückischeren und gefährlicheren Fehler. Haben die Substitution, die der Präprozessor tun auf SQR:

SQR(counter+1) 

wird:

counter+1 * counter+1 

, die ausgeführt wird, als ob es so geschrieben wurden:

counter + (1 * counter) + 1 

Das ist natürlich falsch und nicht was du beabsichtigst. Bei Makros sollten Sie immer die Argumente in Klammern einschließen. So sollte Ihr Makro wie folgt aussehen:

#define SQR(x) ((x) * (x)) 

Jetzt tun die Substitution wieder und Sie erhalten:

((counter+1) * (counter+1)) 

was richtig ist. Machen Sie es sich zur Gewohnheit immer Makro Argumente in Klammern zu enthalten, um diese Art von Fehlern zu vermeiden.

+0

Dies ist ein guter Punkt, aber OP sagt, er weiß darüber und hat es absichtlich getan – squill25

+0

Ein Buch lesen, und es gab dieses Beispiel, das zeigt, dass Sie Klammern brauchen oder so etwas wird passieren, aber dann habe ich dieses Beispiel übertrieben ... – honeyPot

+0

@honeyPot Sie meinen Klammern '()' nicht Klammern '{}'. Recht? –