2016-12-10 5 views
-3
#include<stdio.h> 
#define SQ(x) ((x)*(x)) 

main() 
{ 
    int i = 1; 
    while(i<=5){ 
     printf("result : %d\n", SQ(i++)); 
    } 
} 

auszuführen Fenster:C Makro - unerwünschtes Ergebnis

Ergebnis: 2 Ergebnis: 12 Ergebnis: 30

sollte ich, dass:

Ergebnis: 1 Ergebnis: 4 Ergebnis : 9 Ergebnis: 16 Ergebnis: 25

Wie soll ich diesen Code ändern? diese

+0

Und mir bitte sagen, warum –

+0

'for (int i = 1; i <= 5; i ++) printf (" Ergebnis =% d \ n ", SQ (i));' –

Antwort

0

Ein Makro sein Argument mehr als einmal bewerten kann. Dies liegt daran, dass #define ohne Berücksichtigung der C-Sprachregeln textlich ersetzt wird. Der Präprozessor ersetzt SQ(i++) mit

((i++)*(i++)) 

In diesem Ausdruck i++ zweimal durchgeführt wird, und nicht nur einmal.

Aus diesem Grund wird die Verwendung von #define nicht empfohlen. Schreibe stattdessen eine reguläre Funktion für das gewünschte Verhalten. Oder rufen SQ mit dem Argument i, und erst nach dem Anruf, schreiben i++:

SQ(i); 
i++; 
1

SQ(i++) -> (i++)*(i++)

Verwendung:

printf("result : %d\n", SQ(i)); 
i++;