Forum: Compiler & IDEs Rechenvorschrift bei Zuweisung


von Christian (Gast)


Lesenswert?

Guten Morgen!

Eine Frage zu der einfachen Zeile Code:
1
x += y + z;
Ist offensichtlich nicht das selbe, wie
1
x += (y + z);

Bei mir ist x=2, y = 0 und z = 24 und beim ersten erhalte ich 0 für x 
und nicht wie erwartet 26.

Die Frage ist nun:
Was macht der Compiler/Controller mit dem "+z", wenn er nur "x += y" 
rechnet?

Danke für die Hilfe.

Grüße
Chris

von Christian (Gast)


Lesenswert?

Christian schrieb:
> beim ersten erhalte ich 0 für x

Äh ... Logischerweise 2.
Also es wird nur y zu x addiert, und nicht y und z.

Die Frage ist also, was mit dem z passiert?

von nicht"Gast" (Gast)


Lesenswert?

hm,

was für eine Programmiersprache ist das denn?

in C hat der + operator eine höhere Prio als der += Operator. Eigentlich 
sollte er erst y+z ausrechnen und auf x draufaddieren.

von Bernd (Gast)


Lesenswert?

Hallo TO-Troll, Freitag ist erst morgen.

von Rolf M. (rmagnus)


Lesenswert?

Um welche Sprache geht es denn? In C ist das Ergebnis für beide gleich.

von Christian (Gast)


Lesenswert?

Bernd schrieb:
> Hallo TO-Troll, Freitag ist erst morgen.

Hä!?

Rolf M. schrieb:
> In C ist das Ergebnis für beide gleich.

Ja, C. Aber offensichtlich ist es nicht gleich.

von (prx) A. K. (prx)


Lesenswert?

Christian schrieb:
> Eine Frage zu der einfachen Zeile Code:
>
1
x += y + z;
> Ist offensichtlich nicht das selbe, wie
>
1
x += (y + z);

Es ist in C/C++ dasselbe, ob offensichtlich oder nicht. Wenn das reale 
Ergebnis es nicht ist, dann nicht aufgrund der Sprache.

Der einzige Operator, bei es anders aussieht, ist
  x += y, z
denn das ist
  (x += y), z
und damit nicht
  x += (y, z)

von Bernd (Gast)


Lesenswert?

Christian schrieb:
> Bernd schrieb:
>> Hallo TO-Troll, Freitag ist erst morgen.
>
> Hä!?
>
> Rolf M. schrieb:
>> In C ist das Ergebnis für beide gleich.
>
> Ja, C. Aber offensichtlich ist es nicht gleich.

Es könne auch sein, dass du nicht fähig bist zwei Zeilen primitivsten 
C-Codes zu testen.

von Hugo (Gast)


Lesenswert?

Bernd schrieb:
> Es könne auch sein

dass du nicht fähig bist, eine Zeile primitivstes Deutsch richtig zu 
schreiben.

von Bernd (Gast)


Lesenswert?

Hugo schrieb:
> Bernd schrieb:
>> Es könne auch sein
>
> dass du nicht fähig bist, eine Zeile primitivstes Deutsch richtig zu
> schreiben.

Bin ich froh, dass ich mein Geld mit C verdiene.

Nebenbei: Könnte es sein, dass du nicht bis zwei zählen kannst?

von Yalu X. (yalu) (Moderator)


Lesenswert?

x bleibt also unverändert? Dann schaust du dir das Ergebnis wohl an, 
bevor die Anweisung ausgeführt worden ist.

Poste doch mal dein Testprogramm, das dieses seltsame Verhalten 
aufweist.

von Hugo (Gast)


Lesenswert?

Bernd schrieb:
> Bin ich froh, dass ich mein Geld mit C verdiene.
Du meinst, in C sind Schreibfehler nicht so schlimm?
>
> Nebenbei: Könnte es sein, dass du nicht bis zwei zählen kannst?
Könnte ich schon, wenn zwei Zeilen da wären :-)

von atti (Gast)


Lesenswert?

Christian schrieb:
> Was macht der Compiler/Controller mit dem "+z", wenn er nur "x += y"
> rechnet?

Nix
kannst es aber zuweisen mit w = x += y + z;

von atti (Gast)


Lesenswert?

Da kommen wir aber schon eher in die niederen Gefilde, für die C so 
berüchtigt ist

von zitter_ned_aso (Gast)


Lesenswert?

Das (Assoziativ)Gesetz gilt ja schon in Mathe:
1
 a+(b+c)=(a+b)+c
Die Reihenfolge ist bei der Addition egal.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Christian schrieb:
> Bei mir ist x=2, y = 0 und z = 24 und beim ersten erhalte ich 0 für x und
> nicht wie erwartet 26.
1
$ cat add.c
1
#include <stdio.h>
2
3
int main ()
4
{
5
    int x = 2;
6
    int y = 0;
7
    int z = 24;
8
9
    x += y + z;
10
11
    printf ("%d\n", x);
12
    return 0;
13
}
1
$ cc -Wall -Wextra -Werror -O add.c -o add && ./add
2
26

Noch Fragen?

von A. S. (Gast)


Lesenswert?

Christian schrieb:
> Bei mir ist x=2, y = 0 und z = 24 und beim ersten erhalte ich 0 für x
> und nicht wie erwartet 26.
Wenn das so ist, was bedeutet dann

> Die Frage ist nun:
> Was macht der Compiler/Controller mit dem "+z", wenn er nur "x += y"
> rechnet?
x+=y würde doch 2 und nicht 0 ergeben.

Also Code posten.

von Bimbo. (Gast)


Lesenswert?

Also nochmal an den TO:

In C kommt bei beiden deiner Ausdrücke das Selbe raus. Der Fehler muss 
bei dir liegen oder du verschweigst uns (unbeabsichtigt) wichtige 
Details.

Bitte den ganzen Quellcode in der aktuellen Version zeigen + Angabe des 
Ziels (Mikrocontroller, Linux, etc..)

von (prx) A. K. (prx)


Lesenswert?

zitter_ned_aso schrieb:
> Das (Assoziativ)Gesetz gilt ja schon in Mathe:

In Mathe ja ...

> Die Reihenfolge ist bei der Addition egal.

... aber nicht notwendigerweise auch in C.

In Mathe gibts keinen Überlauf, in C schon. Deshalb gilt
  a + b + c = (a + b) + c
weil der Operator + links-assoziativ definiert ist.

von Rolf M. (rmagnus)


Lesenswert?

Christian schrieb:
> Rolf M. schrieb:
>> In C ist das Ergebnis für beide gleich.
>
> Ja, C. Aber offensichtlich ist es nicht gleich.

Dann ist "offensichtlich" dein Compiler kaputt oder du hast was falsch 
gemacht.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Rolf M. schrieb:
> Dann ist "offensichtlich" dein Compiler kaputt oder du hast was falsch
> gemacht.

Die Schnipsel im Eröffnungsposting sind einfach zuwenig Input. Das kann 
alles mögliche sein, wie zum Beispiel ein nachfolgender Buffer-Overflow 
vor der eigentlichen Ausgabe oder irgendein anderer Fehler, den der TO 
übersehen hat.

von Bimbo. (Gast)


Lesenswert?

Rolf M. schrieb:
> Dann ist "offensichtlich" dein Compiler kaputt oder du hast was falsch
> gemacht.

Vielleicht hat er ja seinen eigenen Compiler programmiert :D

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.