2016-04-01 3 views
1

Warum gibt dies nicht die gewünschte Ausgabe? Für Ex - nehmen Sie a = 1, b = 2, c = 3, d = 4 Es gibt MAX4() = 2, während es in diesem Fall 4 sein sollte.Makroargument innerhalb eines anderen Makros in C nehmen

#include<stdio.h> 
#define MAX4(a,b,c,d) MAX2(MAX2(a,b),MAX2(c,d)) 
#define MAX2(a,b) a>b?a:b 

int a,b,c,d; 

int main(){ 

    /*printf("Please enter 2 integers - \n"); 
    scanf("%d %d",&a,&b); 
    printf("The maximum number among them is %d\n",MAX2(a,b)); 
    */ 
    printf("Please enter 4 integers - \n"); 
    scanf("%d %d %d %d",&a,&b,&c,&d); 
    printf("The maximum number among them is %d\n",MAX4(a,b,c,d));//,MAX2(a,b),MAX2(c,d)); 

    return 0; 
} 
+1

In Klammern verwenden! –

Antwort

3

Sie müssen Klammern hinzuzufügen, um die Reihenfolge der Auswertung zu erzwingen:

#define MAX2(a,b) ((a)>(b)?(a):(b)) 

Die zusätzliche Klammer um Argumente für Ausdrücke wie MAX2(a + 1, b + 2) zu ermöglichen, benötigt werden.

+0

Danke. Ich wusste das nicht. –

3

Makros nur Text ersetzen. So ist der MAX4 Aufruf erweitert ersten Makros in ihren Argumenten, geben

MAX2(a>b?a:b,c>d?c:d) 

, die dann auf

erweitert
a>b?a:b>c>d?c:d?a>b?a:b:c>d?c:d 

Wenn der Compiler dann die erweiterte Makro analysiert, den Vorrang von > (höher als ?:) führt dies zu nicht tun, was du erwartest. Wenn Sie zusätzliche Klammern im Makro verwenden, können Sie das Vorrangproblem vermeiden, aber möglicherweise treten weiterhin Probleme auf, wenn Sie Ihr Makro MAX2 für Ausdrücke mit Nebeneffekten aufrufen.

+0

Und wenn Sie nicht tun können? A: b> c> d? C: d? A> b? A: b: c> d? C: d' in Ihrem Kopf, können Sie nicht anrufen selbst ein Programmierer! Beat mich auf die Antwort :-) –

2

in Ihrem Makro

MAX4(a,b,c,d); 

wenn a = 1, b = 2, c = 3, d = 4, dann das Makro

MAX4(1,2,3,4); 

wird was wiederum wird sich

MAX2(MAX2(1,2),MAX2(3,4)) 

So wird es als

MAX2(1>2?1:2,3>4?3:4) 
0 ausgewertet

d.h

1>2?1:2>3>4?3:4?1>2?1:2:3>4?3:4 

und und nach Operator Vorrang und Assoziativität Sie 2 bekommen und nicht 4.

Um 4 zu erhalten, sollten Sie

#define MAX2(a,b) ((a)>(b)?(a):(b)) 
Verwandte Themen