Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: FAQ - C (C89 und C99) ::  x++ und ++x?     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Krecik
Mitglied

Benutzerprofil
Anmeldungsdatum: 21.09.2001
Beiträge: 45
Beitrag Krecik Mitglied 00:41:00 10.10.2001   Titel:   x++ und ++x?            Zitieren

Ich beschäftige mich schon seit Stunden mit der Frage, was der Unterschied zwischen
C/C++ Code:
blah(blubb-blahblah-1);
blubb--;
blahblah--;
C/C++ Code:
blah(blubb-blahblah-1);
blubb--;
blahblah--;
C/C++ Code:
blah(blubb-blahblah-1);
blubb--;
blahblah--;

und
C/C++ Code:
blah(--blubb-blahblah--);
C/C++ Code:
blah(--blubb-blahblah--);
C/C++ Code:
blah(--blubb-blahblah--);

und
C/C++ Code:
blah((--blubb)-(blah--));
C/C++ Code:
blah((--blubb)-(blah--));
C/C++ Code:
blah((--blubb)-(blah--));

ist. Ich kapier das irgendwie nicht. Ich weiß nur, dass mein Programm sich, je nachdem, wie ich das schreibe, unterschiedlich verhält.

Blah,
Krecik

[edit Shade]
'besserer' Titel fuers FAQ
[/edit]

[ 10.10.2001: Beitrag editiert von: Shade Of Mine ]
Werbeunterbrechung
mauerranger
Mitglied

Benutzerprofil
Anmeldungsdatum: 04.10.2001
Beiträge: 75
Beitrag mauerranger Mitglied 00:55:00 10.10.2001   Titel:              Zitieren

also das erste bespiel kann ich dir erklären :

blah--;

da wird blah um -1 inkrementiert

blah--; ist das selbe wie blah=blah-1;

geht auch mit + , c++; ist das selbe wie c=c+1; [img]images/smiles/icon_biggrin.gif[/img]
und falls du das noch nicht gesehn hast c+=10; ist das selbe wie c=c+10; oder c*=10; ist das selbe wie c=c*10;

also die 2 letzten bespiele von dir ahb ich auch noch net gesehn [img]images/smiles/icon_rolleyes.gif[/img]

_________________
Signatur ? Kann man das essen ? ;)
Unregistrierter





Beitrag Unregistrierter 02:09:00 10.10.2001   Titel:              Zitieren

Das letzte gibt 'nen Error!
Gut, ich nehme mal an, es soll blahblah in der Klammer heißen.
Es gibt einfach einen Unterschied zwischen Präin/decrement und
Postin/decrement.

Um's in Zahlen zu zeigen:
blubb=7 blahblah=4

1.) blah(7-4-1); ausgeführt wird blah(2)
blubb--; blubb wird 6
blahblah--; blah wird 3

2.) blah(--blubb-blahblah--);
blah((--7) - (4--));
blubb wird predecrementiert, d.h, das Decrement wird VOR einer
anderen Berechnung ausgeführt.
blahblah wird postdecrementiert, d.h., das Decrement wird NACH
der anderen Berechnung ausgeführt.
ABER: würde Du b global nehmen und nun in blah printen, so ist
es zu diesem Zeitpunkt doch schon eins weniger!
Praktisch sieht es so aus, daß der Inhalt von blahblah für die
nächste Operation gelesen wird, und blahblah dann decrementiert
wird.
Die Folge:

blubb--;
blah(blubb-blahblah);
blahblah--;

bringt also nur gleiche Resultate, wenn blah nicht direkt auf
blahblah zugreift.

Effektiv wird gerufen:
blah(6-4);
danach sind blubb 6 und blah 3.

3.) identisch zu 2.

Nochmal zur Situation in blah()

1.) blubb=7 blahblah=4
2.+3.) blubb=6 blahblah=4

Nach Ausführung der Befehle gilt in allen Fällen:
blubb=6 blahblah=3

Blubb!
Bashar
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.05.2001
Beiträge: 16828
Beitrag Bashar Mitglied 03:38:00 10.10.2001   Titel:              Zitieren

Mal was zum Nachdenken:

sind die beiden Ausdrücke

--x und (x-- - 1)
(oder auch x-- und (--x + 1))

semantisch äquivalent?

_________________
OSL♥
volkard
Moderator

Benutzerprofil
Anmeldungsdatum: 06.04.2000
Beiträge: 24356
Beitrag volkard Moderator 07:16:00 10.10.2001   Titel:              Zitieren

Zitat:
Original erstellt von Bashar:
Mal was zum Nachdenken:

sind die beiden Ausdrücke

--x und (x-- - 1)
(oder auch x-- und (--x + 1))

semantisch äquivalent?

Ich teste mal, ob --x=x---x mit der anderen Version das gleiche Ergebnis bringt. Wenn ich mal die Compilerfehler wegkriege.

_________________
http://www.venganza.info/
plonk fürs Forum v1.02
Unregistrierter





Beitrag Unregistrierter 10:24:00 10.10.2001   Titel:              Zitieren

@Bashar:
Solange nichts überladen ist, würde ich in rvalue-Situationen spontan mal ja behaupten. Bei --x wird x decrementiert und dann in den
Akku geholt. Bei x-- wird x in den Akku geholt und dann direkt decrementiert. Nun folgt wg. - 1 noch die Decrementierung des Akkus.
Möglicherweise optimiert der Compiler diese erkennbare Situation.
Ein Timerinterrupt der x verwendet könnte ruhig reinhauen, weil er mit dem Akku nichts am Hut hat. An den Limits machts auch nichts aus (selbst wenn x unsigned ist).
volkard
Unregistrierter




Beitrag volkard Unregistrierter 11:01:00 10.10.2001   Titel:              Zitieren

jo, glaub ich auch. und mein Compilerfehler hat irgendwas mit lvalues zu tun.
Kauz01
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.09.2001
Beiträge: 794
Beitrag Kauz01 Mitglied 11:56:00 10.10.2001   Titel:              Zitieren

Ich würde micht versuhcen demn Ausdruck --x einen WErt zuzuweisen [img]images/smiles/icon_biggrin.gif[/img]

_________________
Viele Leute glauben zu denken, dabei ordnen sie lediglich ihre Vorurteile neu.
(Williams James)
Shade Of Mine
Moderator

Benutzerprofil
Anmeldungsdatum: 04.05.2001
Beiträge: 17739
Beitrag Shade Of Mine Moderator 13:36:00 10.10.2001   Titel:              Zitieren

--x == x-- -1;

ich wuerde sagen nein [img]images/smiles/icon_wink.gif[/img]

denn das ist ja die kurzschreibweise fuer

x=x-1;
x==x-1;
x=x-1;

und x ist definitive ungleich x-1

allerdings wuerde ich sagen dass sie semantisch aequvalent sind [img]images/smiles/icon_smile.gif[/img]
beispiel:

--x==y;

lange form:
x=x-1;
x==y

x-- -1==y;

lange form:
x-1==y
x=x-1;

bei beiden variante wird das um 1 verringerte x mit y verglichen und danach hat x den wert von x-1...

also semantisch gleich...

_________________
A language that doesn't affect the way you think about programming is not worth knowing.
mauerranger
Mitglied

Benutzerprofil
Anmeldungsdatum: 04.10.2001
Beiträge: 75
Beitrag mauerranger Mitglied 14:58:00 10.10.2001   Titel:              Zitieren

hier noch mal was von mir [img]images/smiles/icon_wink.gif[/img]

also wenn da steht :

a=b++;

dann wird a zuerst der wert von b zu gewiesen und b wird dann um eins inkremitiert
schreibt man aber

a=++b;

wird b zuerst um 1 inkrementiert und dann wird a der wert von b zu gewiesen [img]images/smiles/icon_smile.gif[/img]

doppelt gemoppelt gehts aber net [img]images/smiles/icon_wink.gif[/img]

also a=++b++; geht net !!

also ich denk jetzt dürften auch die 2 letzen beispiele mit ein wenig logischen denken gemeistert werden [img]images/smiles/icon_wink.gif[/img]

_________________
Signatur ? Kann man das essen ? ;)
volkard
Moderator

Benutzerprofil
Anmeldungsdatum: 06.04.2000
Beiträge: 24356
Beitrag volkard Moderator 15:10:00 10.10.2001   Titel:              Zitieren

Zitat:
Original erstellt von Kauz01:
Ich würde micht versuhcen demn Ausdruck --x einen WErt zuzuweisen [img]images/smiles/icon_biggrin.gif[/img]


Warum?
--x ist doch ein lvalue.
--x-- geht deshalb nicht, weil rechte Operatoren meistens vor linken ausgewertet werden.
--(x--) geht also net.
Bei (--x)-- seh ich kein Problem.

_________________
http://www.venganza.info/
plonk fürs Forum v1.02
volkard
Moderator

Benutzerprofil
Anmeldungsdatum: 06.04.2000
Beiträge: 24356
Beitrag volkard Moderator 15:17:00 10.10.2001   Titel:              Zitieren

Zitat:
Original erstellt von Shade Of Mine:
--x == x-- -1;
ich wuerde sagen nein [img]images/smiles/icon_wink.gif[/img]

Ich auch.
Ich wollte ja nur
--x == x-- -1;
compilieren und dann schauen, ob ich --x durch (x-- - 1)
ersetzen kann und es kommt das gleiche raus.

_________________
http://www.venganza.info/
plonk fürs Forum v1.02
Shade Of Mine
Moderator

Benutzerprofil
Anmeldungsdatum: 04.05.2001
Beiträge: 17739
Beitrag Shade Of Mine Moderator 15:27:00 10.10.2001   Titel:              Zitieren

dann sind wir ja der selben meinung, volkard [img]images/smiles/icon_wink.gif[/img]

_________________
A language that doesn't affect the way you think about programming is not worth knowing.
Kauz01
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.09.2001
Beiträge: 794
Beitrag Kauz01 Mitglied 15:29:00 10.10.2001   Titel:              Zitieren

@virtual volkard

Weißt du ob bei "--x == x-- -1;" die Evaluationsreiehnfolge festgelegt ist?
Ob --x das gleiche wie x-- -1 ist kriegst du auf diese Art aber nicht raus!
Bsp.:

int x = 2;
--x == x-- - 1;
// Hier ist x sicher == 0

_________________
Viele Leute glauben zu denken, dabei ordnen sie lediglich ihre Vorurteile neu.
(Williams James)
mauerranger
Mitglied

Benutzerprofil
Anmeldungsdatum: 04.10.2001
Beiträge: 75
Beitrag mauerranger Mitglied 16:28:00 10.10.2001   Titel:              Zitieren

also wenn x 2 ist dann ist --x =1 !! weil das das selbe ist wie x-- !!

nur wenn das -- vor x steht wird sie als erstes aus gewertet ! wenn -- nach x steht wirds erst als letztes ausgewertet!


int a=10;
int b;

b=a++;
hier ist a 11 und b 10 weil b erst der wert von a zugewiesen wird und dann wird a inkrementiert !

bei b=++a;

wird erst a inkrementiert und dann wird der wert von dem dann inkrementierten a b zugewiesen !!! alost ist a 11 und b 11 !!

deshalb ist --x != x-- -1 !!

[ 10.10.2001: Beitrag editiert von: mauerranger ]

_________________
Signatur ? Kann man das essen ? ;)
Kauz01
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.09.2001
Beiträge: 794
Beitrag Kauz01 Mitglied 16:42:00 10.10.2001   Titel:              Zitieren

Nochmal ein kleiner Beitrag

int a1,b1,a2,b2;
a1 = b1 = 2;

a2 = a1-- - 1; // a2 == 1
b2 = --b1; // b2 == 1

Soweit gut?

a1-- - 1 == --b1 hat also den Wert true.

Aber

(--x == x-- -1 ) hat sicher den Wert false!

Begründung:
Eine Seite wird als erstes evaluiert. Soweit ich weiß ist hier keine Reihenfolge festgelegt. Damit wird der Wert von x verändert! Dann wird die zweite Seite evaluiert und der Wert von x nochmals verändert. Nach dem Statement ist also der Wert von x um 2 gesunken.
Weiter hat der als erstes ausgewertete Ausdruck einen Wert, der um 1 größer ist, als der zuletzt ausgewertete Ausdruck.

Einwände werden entgegengenommen. [img]images/smiles/icon_smile.gif[/img]

_________________
Viele Leute glauben zu denken, dabei ordnen sie lediglich ihre Vorurteile neu.
(Williams James)
Shade Of Mine
Moderator

Benutzerprofil
Anmeldungsdatum: 04.05.2001
Beiträge: 17739
Beitrag Shade Of Mine Moderator 18:54:00 10.10.2001   Titel:              Zitieren

@kauz
genau dass haben doch volkard und ich schon festgestellt [img]images/smiles/icon_wink.gif[/img]

@mauerranger
ja, wir kennen die pre- und post incerement/decrement operatoren [img]images/smiles/icon_wink.gif[/img]

_________________
A language that doesn't affect the way you think about programming is not worth knowing.
C/C++ Forum :: FAQ - C (C89 und C99) ::  x++ und ++x?   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum nicht antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.