Macros-Frage
-
hallo. könnte mir jemand mal hier bei den macros helfen und sagen was als rückgabewert zu werwarten ist jeweils?
1. #define F1(zahl)(zahl)<0 ? -(zahl):(zahl) 2. #define F2(a, b)((a)<(b) ? (a):(b))weiss leide rnicht so genau wie ich das betrachten soll.
-
Rückgabewert? Ein Makro hat keinen Rückgabewert. Makros sind dumme Textersetzungsanweisungen. Ein Beispiel für jedes Makro:
F1(5); // Wird ersetzt zu: (5)<0 ? -(5):(5); F2(5, 6); // Wird ersetzt zu: ((5)<(6) ? (5):(6))Was ein Conditional Operator ist, bzw. tut, wirst du wohl noch wissen, hoffe ich. Ansonsten kannst du es hier nachlesen:
http://www.cplusplus.com/doc/tutorial/operators/In C++ übrigens definitiv der falsche Einsatzbereich für Makros. Für sowas würde man in C++ ein Funktionstemplate verwenden.
Grüssli
-
Was sollen diese Makros überhaupt? Für F1 gibt es z.B. die Funktion abs bzw. fabs (absoluten Betrag bekommen), für F2 gibt es std::min.
-
_matze schrieb:
Was sollen diese Makros überhaupt? Für F1 gibt es z.B. die Funktion abs bzw. fabs (absoluten Betrag bekommen), für F2 gibt es std::min.
keine bange, diese makros sah man oft. deswegen fragte der lehrer auch nach genau diesen makros, weil sie so oft vorkamen und noch einigermaßen sinnvoll und leicht verständlich sind.
-
[quote="merchant"]
#define F2(a, b)((a)<(b) ? (a):(b))Ich glaube Dein Problem ist, dass Du neben der eigentlichen Makrodefinition den "bedingten Ausdruck" nicht erkennst. Ein bedingter Ausdruck ist ein Konstrukt, dass wie folgt aussieht:
if(a > b) z=a; else z=b;und in der folgenden Form abgekürzt werden kann:
z = (a < b) ? a : b;Umgangssprachlich heisst das, dass wenn der Ausdruck (a < b) wahr ist, dann wird a zurückgegeben, ansonsten b.
Bedingte Ausdrücke sind ein Erbe der Programmierspache C und finden auch in C++ anwendung.
Dein spezielles Makro entspricht in C++ -wie von _matze bereit erwähnt- der Funktion im namespace std:
z = min(a,b);Es ist zwar richtig, dass Dravere schreibt, dass Deine Markos keinen Rückgabetyp besitzen, aber das soll nicht heissen, dass Du das Makro nicht auf die rechte Seite einer Zuweisung setzen kannst, da der Ausdruck einen Wert hat, den Du einer Variable zuwesien kannst. Das sieht dann so aus:
int a = 5; int b = 6; int z = 0; z = F2(a,b); // z ist jetzt 5Warum die Klammern im Makro so gesetzt sind kannst Du in jeder guten Einführung über den C Präprozessor nachlesen. Wohlgemerkt C, da man in C++ versucht den Präprozessor mit seinen Schwächen zu vermeiden.
Gruß,
B!