Forum: PC-Programmierung Warum wird x++ wird nicht ausgeführt


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.
von Helmut S. (helmuts)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,
in einem eineren Forum habe ich das 1. Beispiel gefunden und ich dachte 
ich verstehe das Ergebnis. Neugierig habe ich dann ein ähnliches 
Beispiel konstruiert, aber ich wundere mich über das Ergebnis des 2. 
Beispieles.
Programmiersprache ist C. Ich habe beide Beispiele mit Visual Studio und 
mit Dev C++ getestet. Beides mal das gleiche Ergebnis.

x = 5;
y = x++ == 4 || x == 5;

Ergebnis: x=6 und y=0
OK


x = 5;
y = x == 5 || (x++ == 5);

Ergebnis: x=5 und y=1

Warum wird in dem zweiten Beispiel das x++ nicht ausgeführt?

Gruß
Helmut

von Toni Tester (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Weil der erste Teil der if-Bedingung
1
x == 5

wahr ist => Der zweite Teil wird gar nicht mehr ausgeführt (Warum sollte 
er auch - das Ergebnis des ORs steht ja schon fest).

von Tassilo H. (tassilo_h)


Bewertung
0 lesenswert
nicht lesenswert
Weil die Auswertung des logischen Oder (||) nach dem ersten Ausdruck 
(x==5) abgebrochen wird, da das Ergebnis danach bereits feststeht.

von jj (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Weil der erste Teilausdruck bereits als wahr ausgewertet wird.

Gruß J

von Helmut S. (helmuts)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

vielen Dank fuer die schnellen Antworten. Ich hatte immer nur an die 
Rangordnung(precedence) der Operatoren gedacht.

Gruss,
Helmut

von Noch einer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
"Kurzschlussauswertung"

Dachte immer, in der deutschen Sprache würde es auch "Short-circuit 
Evaluation" genannt.

von Carl D. (jcw2)


Bewertung
0 lesenswert
nicht lesenswert
Helmut S. schrieb:
> Hallo,
>
> vielen Dank fuer die schnellen Antworten. Ich hatte immer nur an die
> Rangordnung(precedence) der Operatoren gedacht.
>
> Gruss,
> Helmut

Wenn man keinen "Kurzschluß" will, kann man auch mit | bitweise 
verodern. Funktioniert mit beliebigen integer-Werten, wozu auch bool 
gehört, das alles was irgendwie ein gesetztes Bit hat, "wahr" ist.

Bei & statt && ist das differenzierter zu betrachten, denn
1
(0x10 & 0x01) != (0x10 && 0x01)
weil sich eben ungleich gesetzte Bits maskieren.

von Rolf M. (rmagnus)


Bewertung
-1 lesenswert
nicht lesenswert
Carl D. schrieb:
> Helmut S. schrieb:
>> Hallo,
>>
>> vielen Dank fuer die schnellen Antworten. Ich hatte immer nur an die
>> Rangordnung(precedence) der Operatoren gedacht.
>>
>> Gruss,
>> Helmut
>
> Wenn man keinen "Kurzschluß" will, kann man auch mit | bitweise
> verodern. Funktioniert mit beliebigen integer-Werten, wozu auch bool
> gehört, das alles was irgendwie ein gesetztes Bit hat, "wahr" ist.

Sofern das Ergebnis nur als boolescher Wert genutzt wird und nicht 
zwingend nur 0 oder 1 sein darf. Aber gerade dann würde ich auf jeden 
Fall || hinschreiben, denn das dokumentiert die Absicht besser. 
Abgesehen davon ist das Beispiel des TE nur mit || definiert. Mit | 
ergibt sich undefiniertes Verhalten. Sinnvoller wäre in dem Fall, das 
x++ da rauszuziehen. Dann ist auch der "Kurzschluss" egal. Der stört ja 
nur, wenn auf der rechten Seite etwas steht, das Nebeneffekte hat und 
auf jeden Fall ausgeführt werden muss.

von Helmut S. (helmuts)


Bewertung
2 lesenswert
nicht lesenswert
Mein Beispiel war nur für mich zum Üben bezüglich der Rangordnung von 
Operatoren. Ich würde niemals so eine Zeile tatsächlich verwenden.

von Noch einer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
>Ich würde niemals...

Das hatten wir früher auch mal gedacht. Heute finden wir das normal, gut 
lesbar. Den Stiel, den sie uns in der Ausbildung beibrachten, empfinden 
wir Heute als unentzifferbar verwirrend.

von M.K. B. (mkbit)


Bewertung
1 lesenswert
nicht lesenswert
Rolf M. schrieb:
> Abgesehen davon ist das Beispiel des TE nur mit || definiert. Mit |
> ergibt sich undefiniertes Verhalten.

Das ist richtig. Hier ist auch eine Beschreibung, warum das so ist.
https://en.wikipedia.org/wiki/Sequence_point

Im Prinzip ist bei || festgelegt, dass alles links davon ausgewertet 
werden muss, bevor der rechte Teil ausgewertet wird.
Bei | ist das nicht der Fall und der Compiler dürft z.B. das x++ auch 
erst nach dem x == 5 auswertet.

von Klaus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Helmut S. schrieb:
> Ich würde niemals so eine Zeile tatsächlich verwenden.

Das gibt aber in anderen Sprachen so nett lesbare Zeilen wie
1
open( FILE, "<filename" ) or die "Cannot open filename: $!\n";

MfG Klaus

von Sheeva P. (sheevaplug)


Bewertung
2 lesenswert
nicht lesenswert
Klaus schrieb:
> Helmut S. schrieb:
>> Ich würde niemals so eine Zeile tatsächlich verwenden.
>
> Das gibt aber in anderen Sprachen so nett lesbare Zeilen wie
>
1
> open( FILE, "<filename" ) or die "Cannot open filename: $!\n";
2
>

Ausgerechnet Perl als "nett lesbar" zu bezeichnen, erscheint mir dann 
doch ein wenig... gewagt. ;-)

von S. R. (svenska)


Bewertung
-1 lesenswert
nicht lesenswert
Naja, Perl schenkt einem neben "||" und "&&" eben auch die niedriger 
priorisierten auch "or" und "and". Damit ist die Zeile tatsächlich gut 
lesbar und offensichtlich.

Man muss eben nur eine Menge wissen, und da Perl hauptsächlich aus 
syntaktischem Zucker besteht...

von Klaus (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Sheeva P. schrieb:
> Ausgerechnet Perl als "nett lesbar" zu bezeichnen, erscheint mir dann
> doch ein wenig... gewagt. ;-)

Na gut, "stirb!" ist nicht wirklich nett. Aber: argv[3] or 
"DefaultFile.name" klingt doch besser, or?

MfG Klaus

von Sheeva P. (sheevaplug)


Bewertung
0 lesenswert
nicht lesenswert
S. R. schrieb:
> Naja, Perl schenkt einem neben "||" und "&&" eben auch die niedriger
> priorisierten auch "or" und "and". Damit ist die Zeile tatsächlich gut
> lesbar und offensichtlich.
>
> Man muss eben nur eine Menge wissen, und da Perl hauptsächlich aus
> syntaktischem Zucker besteht...

Perl war mehr als fünfzehn Jahre meine Feld-, Wald- und 
Wiesenskriptsprache und daher nahezu täglich im Gebrauch. Insofern kenne 
ich Perl ganz gut und weiß, daß man damit durchaus halbwegs lesbaren 
Code schreiben kann -- wenn man Erfahrung, Disziplin und ein bisschen 
Mühe investiert. Aber verglichen mit modernen Skriptsprachen wie Python 
oder Lua... ;-)

von Sheeva P. (sheevaplug)


Bewertung
-1 lesenswert
nicht lesenswert
Klaus schrieb:
> Na gut, "stirb!" ist nicht wirklich nett.

Gerade das war einer der Teile von Perl, die ich wirklich gemocht habe. 
Viel schöner als
1
FILE* fp = fopen("filename", "r");
2
if( ! fp ) {
3
    fprintf(stderr, "Could not open file: %s\n", "filename");
4
    exit(1);
5
}

Noch viel schicker finde ich da allerdings so etwas wie in Python:
1
ifh = open("filename", "r")

Da muß ich nämlich gar kein eigenes Errorhandling betreiben: wenn Python 
die Datei nicht öffnen kann, wirft es eine aussagekräftige Exception 
(IOError: No such file or directory: 'filename').

> Aber: argv[3] or "DefaultFile.name" klingt doch besser, or?

"DefaultFile.name" klingt für mich auch nicht toll: CamelCase, aber 
nicht konsequent durchgezogen. Ist das irgendwas microsoftes?

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]
  • [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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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