mikrocontroller.net

Forum: Compiler & IDEs Rechenvorschrift bei Zuweisung


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen!

Eine Frage zu der einfachen Zeile Code:
x += y + z;
Ist offensichtlich nicht das selbe, wie
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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: nicht"Gast" (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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.

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo TO-Troll, Freitag ist erst morgen.

Autor: Rolf M. (rmagnus)
Datum:

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

Autor: Christian (Gast)
Datum:

Bewertung
-2 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian schrieb:
> Eine Frage zu der einfachen Zeile Code:
>
x += y + z;
> Ist offensichtlich nicht das selbe, wie
>
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
Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hugo (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Bernd schrieb:
> Es könne auch sein

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

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Hugo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: atti (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: atti (Gast)
Datum:

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

Autor: zitter_ned_aso (Gast)
Datum:

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

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht 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.
$ cat add.c
#include <stdio.h>

int main ()
{
    int x = 2;
    int y = 0;
    int z = 24;

    x += y + z;

    printf ("%d\n", x);
    return 0;
}
$ cc -Wall -Wextra -Werror -O add.c -o add && ./add
26

Noch Fragen?

: Bearbeitet durch Moderator
Autor: A. S. (achs)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bimbo. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..)

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bimbo. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.