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)

: Bearbeitet durch User
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.

: Bearbeitet durch Moderator
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?

: Bearbeitet durch Moderator
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.

: Bearbeitet durch User
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.