Operatoren
-
Hallo, bin mir aber nicht sicher, ob das so richtig ist. vielleicht kann mir ja jemand drüber schauen. Für a=3
Schreiben Sie ein Programm, das nacheinander den Wert der Ausdrücke
• ++a < 10 && 25 + 3 != 25
• 15 > a || 15 < 5 * --a
• a += a != 5 && 3;
• a %= 3a - 5 && 2a +2 || a - 10;
mit printf ausgibt. Setzen Sie dann Klammern, um die Anordnung der Operationen klar erkennbar zu machen, ohne den Wert
oder die Nebenwirkungen der Ausdrücke zu ändern.ich habe dashier daraus gemacht:
#include <stdio.h>
int main() {
int a;
a = 3;
(++a < 10) && ((25 + 3) != 25);
printf("%d\n", a);(15 > a) || (15 < (5 * --a));
printf("%d\n", a);((a += a) != 5) && 3;
printf("%d\n", a);(a %= ((3a)) - 5)) && ((2a) +2) || (a - 10);
printf("%d\n", a);return 0;
}Vielen Dank schon mal
-
Das compiliert ja nicht einmal, wie könnte es richtig sein? Ansonsten hast du die Aufgabe nicht verstanden: Es ist nicht gefragt, was der Wert von a ist, sondern was der Wert von
++a < 10 && 25 + 3 != 25
usw. ist.PS: Da da teilweise Kursivtext in deinem Code steht, spekuliere ich mal, dass das bei dir vielleicht doch compiliert. Der Code ist bloß der Markdownformatierung hier im Forum zum Opfer gefallen. Wenn du deinen Code oben und unten in
```
einschließt, passiert dies nicht. Wahrscheinlich hast du also so etwas gemeint:#include <stdio.h> int main() { int a; a = 3; (++a < 10) && ((25 + 3) != 25); printf("%d\n", a); (15 > a) || (15 < (5 * --a)); printf("%d\n", a); ((a += a) != 5) && 3; printf("%d\n", a); (a %= ((3*a)) - 5)) && ((2*a) +2) || (a - 10); printf("%d\n", a); return 0; }
Besser, oder? Was mit der Klammerung in Zeile 14 von dir gemeint ist kann ich aber nicht erraten, da musst du korrigieren. Nach wie vor gilt natürlich, dass die Aufgabenstellung nicht erfüllt ist.
-
@SeppJ sorry, der hat die * nicht übernommen.
#include <stdio.h>
int main() {
int a;
a = 3;
(++a < 10) && ((25 + 3) != 25);
printf("%d\n", a);(15 > a) || (15 < (5 * --a));
printf("%d\n", a);((a += a) != 5) && 3;
printf("%d\n", a);(a %= ((3 * a) - 5)) && ((2 * a) +2) || (a - 10);
printf("%d\n", a);return 0;
}dass da die werte für die ausdrücke rauskommen müssen ist mir bewusst. ich muss das noch etwas schöner aufschreiben. ich weiß nur nicht, ob die werte auch so richtig sind.
-
@SeppJ oke danke, dann schaue ich noch mal drüber
-
@black-lemon sagte in Operatoren:
ich weiß nur nicht, ob die werte auch so richtig sind.
Es ließe sich ja leicht testen, ob es überhaupt plausibel ist, indem du die Ausdrücke ausgibst. Einmal mit und einmal ohne Klammern. Was ja sicher auch nicht ohne Grund ein (bisher unerfüllter) Teil der Aufgabenstellung ist. Wenn das gegeben ist, dann kann man nochmal gucken, ob es auch wirklich richtig ist, oder ob nur zufällig dasselbe herauskommt.
Da die Ausdrücke (mit Absicht) Nebeneffekte haben, ist es vielleicht einfacher, wenn du zwei Programme schreibst und vergleichst: Einmal die Ausgaben ohne Klammern, und eines mit Klammern.
-
@black-lemon sagte in Operatoren:
sorry, der hat die * nicht übernommen.
Hat er immer noch nicht, da du deinen Code nicht als Code markiert hast.
Markiere deinen Code mit der Maus und drücke auf </> über dem Editfenster (rechts neben dem C++).
Das kannst du auch nachträglich tun, wenn du bei deinem Beitrag rechts unten auf die drei senkrechten Punkte klickst und dann Bearbeiten auswählst.
-
@SeppJ Dankeschön! werde ich gleich mal machen. habe glaube ich erst jetzt wirklich verstanden was man von mir möchte. der wert muss ohne klammern der gleiche sein wie mit klammern, richtig?
-
@black-lemon sagte in Operatoren:
@SeppJ Dankeschön! werde ich gleich mal machen. habe glaube ich erst jetzt wirklich verstanden was man von mir möchte. der wert muss ohne klammern der gleiche sein wie mit klammern, richtig?
Erstens muss der Wert vom Ausdruck selbst unverändert bleiben, zweitens der Wert von a nach dem Ausdruck: "Setzen Sie dann Klammern, um die Anordnung der Operationen klar erkennbar zu machen, ohne den Wert oder die Nebenwirkungen der Ausdrücke zu ändern."
Da ich gerade ungeduldig bin, habe ich mal die beiden Programme selber geschrieben, mit der Klammerung von der ich vermute, dass du sie wohl gemeint hast:
https://ideone.com/hIohj2
https://ideone.com/FuEoe0
Wie du siehst, laufen sie schon beim 3. Ausdruck auseinander, so ganz kann es also noch nicht stimmen.
-
@SeppJ ahh ich habs verstanden. Vielen lieben Dank für die Geduld!! und die Hilfe natürlich!
-
Dann kann man jetzt ja auch auf den Inhalt eingehen: Wie man an meinen Beispielprogrammen schon gesehen hat, ist spätestens deine dritte Klammerung falsch:
a += a != 5 && 3
ist nicht das gleiche wie((a += a) != 5) && 3
. Jetzt weiß ich nicht, was dir mehr hilft. Einerseits kann ich schlicht auf eine Liste der Operatoren verweisen und sagen: Wende das an!Andererseits kann ich dir auch ein ungefähres Gefühl vermitteln, damit du nicht alles auswendig lernen musst: Alles, was irgendwie eine Art Zuweisung ist, das bindet sehr schwach. Also alles mit Gleichheitszeichen, außer es ist ein Vergleich. Die ganze Bitlogik (also alles mit
|
und&
) bindet auch sehr schwach, aber mehr als Zuweisungen und UND bindet jeweils stärker als ODER. Darüber kommen alle Vergleiche. Dann alles, was man aus der Grundschule kennt, und ganz oben das spezifische C-Zeug.Das heißt, bei Zuweisungen kann man immer schreiben
x = irgendwas
und braucht sich keine Sorgen machen, dass das=
plötzlich irgendwie mit dem Ausdruck wechselwirkt. Ausdrücke kann man auch immer logisch verknüpfenX && Y
oderX || Y
und braucht auch nicht groß wissen, wasX
undY
sind. Und bei Vergleichen darf man auch recht sorglosX != Y
,X < Y
etc. schreiben, solange X und Y keine Logikoperationen (&&
,||
) enthalten. Und dann darüber kennt man alles aus der Schule, oder es ist C-spezifisches Zeug, das einfach so funktioniert, wie es soll.Und damit kann man dann erklären, wieso
a += a != 5 && 3
ist nicht das gleiche ist wie((a += a) != 5) && 3
. Da hat man zuerst eine Zuweisung mit dem+=
und du machst genau das Gegenteil von der schwächsten Bindung, und bindest es am stärksten. Dabei kommt das+=
zu allerletzt dran.
-
@SeppJ Vielen Lieben Dank! Habe die Aufgabe dann doch noch lösen können und abgeschickt.
#include <stdio.h> int main() { int a=3; printf("Ausdruck 1: %d\n", ++a < 10 && 25 + 3 != 25); printf("Ausdruck 1 mit Klammern: %d\n", (((++a) < 10) && ((25 + 3) != 25))); //zu erst wird a++ ausgeführt, also a inkrementiert. danach wird der arithmetische Ausdruck ausgewertet, danach erst das logische und // nach der inkremention ist a=4 int d; d=a; printf("Ausdruck 2: %d\n", 15 > a || 15 < 5 * --a); printf("Ausdruck 2 mit Klammern: %d\n", ((15 > d) || (15 < (5 * (--d))))); //da 15>4 wahr ist und danach ein logisches oder kommt, bricht es danach ab und a bleibt 4 int e; e=a; printf("Ausdruck 3: %d\n",a += a != 5 && 3); printf("Ausdruck 3 mit Klammern: %d\n",(e += (e != 5) && 3)); //da a ungleich 5 ist wird daraus eine 1. danach wird 1 und 3 ausgewertet, was auch wahr ist also eine 1 da steht. // am bleibt 4 +1. somit ist jetzt a=5 int h; h=a; printf("Ausdruck 4: %d\n", a %= 3*a - 5 && 2*a +2 || a - 10); printf("Ausdruck 4 mit Klammern: %d\n", (h %= (((3*h) - 5) && ((2*h) +2 || (h - 10))))); //als erstes wird wieder die arithmetik ausgewertet. dann steht da 10 und 12, was wahr ist, also steh da 1. //1 oder 5 ergibt auch 1. modulo 1 ergibt dann 0 // a ist jetzt also gleich 0 return 0; } hoffe mal, dass es so richtig ist. werde am Montag die Korrektur erhalten :D
-
Kleiner Faux-pas: Dein a hat nicht den erwarteten Wert im weiteren Programmverlauf, da in Zeile 6 das a nochmals inkrementiert wird. Deine Idee, wie du das für die späteren Ausdrücke mittels weiterer Variablen vermeidest ist schon gut, aber beim ersten mal musst du das auch machen.
-
@SeppJ ahh stimmt, danke! ist mir garnicht aufgefallen. werde das nächste mal dran denken!