Hilfe!
-
Hallo!
Habe eine Frage bezüglich dieses Programms. Habe folgende Aufgabenstellung bekommen.
#define any(a,b) (a < b ? a : b)
int main(int argc, char *argv[])
{
int x;
x = any(5 & 5, 8 & 5);printf("x = %d\n\n",x);
system("PAUSE");
return 0;
}Der Lehrer schreibt: Das Programm funktioniert nicht wie erwünscht. Bitte korrigieren.
Ich weiss das 5 & 5 bitweise ausgewertet wird und true ergibt. 8 & 5 false.
Werte. Warum bekomme ich als Resultat 5 ausgegeben. Bitte um Hilfe.DocFirestorm
-
Das solltest du ins Spezialgebiet posten, das da heißt C++-Forum
Allerdings hier ein Anhaltspunkt.
8 mit 5 binär und verknüpft gibt AFAIK 0.Dadurch wird der any ausdruck false und gibt a zurück.
a ist 5 mit 5 bitweise und verknüpft, was wieder 5 gibt.Die Lösung sollte dier nun selbst einfallen
-
Danke für den Hinweis und die Erklärung.
Ich wusste nicht dass wenn false zurück kommt, der erste Wert genommen wird.
Danke
-
Das ist schon mal eine gute Idee:
Beowulf schrieb:
Das solltest du ins Spezialgebiet posten, das da heißt C++-Forum
Und die Überschrift "Hilfe!" ist ABSOLUT UNBRAUCHBAR. "Hilfe!" - was soll das sein? Alle 350000 Beiträge haben "Hilfe!" gesucht und nehmen wir nur mal an, 20% davon hätten ihre Frage "Hilfe!" betitelt.
-
DocFirestorm schrieb:
Ich wusste nicht dass wenn false zurück kommt, der erste Wert genommen wird.
Das ist ja auch falsch. Bei false wird der zweite Wert genommen, bei true der erste.
a ist 5&5=5, bist 5&8=0. a<b sollte also false sein. Daher sollte der zweite Wert genommen werden. Das Programm müsste also 0 ausgeben.Das tut es aber nicht. Es gibt 5 aus. Und dein Lehrer will jetzt wissen wieso.
Ansatz: gibt es einen Unterschied zwischen (5 & 5 < 8 & 5) und ( (5 & 5) < (8 & 5) ) ?
-
Danke für eure Antworten!
Ich glaub schön langsam komme ich dahinter. Aber ich bin ein absoluter Anfänger in C, deshalb würde mich interessieren was so ein konstrukt auf sich hat und wofür es gebraucht wird, und auf was es abzielt.
-
DocFirestorm schrieb:
deshalb würde mich interessieren was so ein konstrukt auf sich hat und wofür es gebraucht wird, und auf was es abzielt.
Welches Konstrukt meinst du?
den ?: Operator?
-
Welches Konstrukt meinst du ?
a < b ? a : b ?<Bedingung> ? <Ausdruck1> : <Ausdruck2>
Bei diesem Konstrukt steht zuerst eine Bedingung oder irgendetwas anderes was true oder false sein kann.
z.B:
a < b
3*b == c
oder auch ein FunktionsaufrufDanach kommen zwei Ausdrücke, die durch ein : getrennt sind. Wenn die Bedingung true ist, dann wird Ausdruck1 bearbeitet. Wenn sie false ist dann Ausdruck2. Wenn das Konstrukt rechts von einem = ist (z.B. c = a < b ? a : b;),
dann wird das Ergebnis von Audruck1 bzw. Ausdruck2 in c gespeichert.
Ausdruck1 und 2 können eine Berechnung sein so wie z.B. a*3+c oder auch ein Funktionsaufruf.
-
Sorry falsch ausgedrückt:
Das Programm kenne ich, und kann ich auch nachvollziehen. Das was ich nicht verstehe ist.
5 & 5 , 8 & 5
Ich weiss dass hier binär verglichen wird. Das andere ist mir alles klar, nur dieser Teil mach mir Kopfzerbrechen. Was geschieht hier und auf was zielt es ab. Sollte es vielleicht so aussehen 10,13 oder irgendwas in der Richtung. Für was ist diese Bitoperatin notwendig.
0000 0101
0000 0101
---------
0000 0101 = 5 also trueund
0000 1000
0000 0101
---------
0000 0000 = 0 also false
-
Ja
5 & 5 = 5
8 & 5 = 0
Das hast du schon völlig richtig verstanden.Natürlich macht es keinen Sinn in einem Programm 8&5 anstelle von 0 zu schreiben aber in der Schule hat man häufig solche praxisfernen Aufgaben.
Was der Lehrer hier wissen will ist wieso das Programm 5 ausgibt obwohl es eigentlich die kleinere Zahl, also 0 ausgeben sollte.
(a < b ? a : b) müsste doch eigentlich die kleinere der beiden Zahlen liefern.
-
DrZoidberg schrieb:
(a < b ? a : b) müsste doch eigentlich die kleinere der beiden Zahlen liefern.
Nein tut es nicht.
Schau dir den Define noch einmal an:
#define any(a, b) (a < b ? a : b)
und wie wird das ganze aufgerufen?
x = any( 5 & 5, 8 & 5);
Und was macht der Precompiler daraus? (Einfach mal "gcc -E main.c" aufrufen.)
Also spielen wir mal kurz Precompiler:x = (5 & 5 < 8 & 5 ? 5 & 5 : 8 & 5);
es wird also: 8 & 5 ausgewertet und nicht wie eigentlich gewollt:
x = ((5 & 5) < (8 & 5) ? (5 & 5) : (8 & 5));
Hier der angepasste Quellcode:
#include <stdio.h> #define any(a, b) ((a) < (b) ? (a) : (b)) int main(int argc, char* argv[]) { int x; x = any(5 & 5, 8 & 5); printf("x = %d\n\n", x); return 0; }
-
Vielen Dank für eure Hilfe! Das wollte ich wissen
-
@Descartes:
Da sollte DocFirestorm doch selber drauf kommen. Wegen dem höheren Lerneffekt.