mikrocontroller.net

Forum: PC-Programmierung C/C++: Kennt ihr diesen "Operator" schon?


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: C. P. P. Lovejoy (Gast)
Datum:

Bewertung
3 lesenswert
nicht lesenswert
Das folgende C++ Konstrukt hab ich grad so ähnlich im Netz entdeckt:
for (unsigned int i = stdv.size(); i --> 0; )
{
  std::cout << stdv[i];
}

Ich habs weder gekannt, noch auf anhieb verstanden. Da es auch in C 
geht, wollt ichs Euch nicht vorenthalten.

Ist von dort: 
https://stackoverflow.com/questions/275994/whats-the-best-way-to-do-a-backwards-loop-in-c-c-c

Autor: g457 (Gast)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Welcher "operator" ist denn so neu für Dich? Ich seh da nur 
Standardkost.

Autor: Carl D. (jcw2)
Datum:

Bewertung
3 lesenswert
nicht lesenswert
Formatierung mit Mehrwert ;-)

Autor: nicht"Gast" (Gast)
Datum:

Bewertung
8 lesenswert
nicht lesenswert
Standardkost würde ich jetzt nicht sagen.

Ich würde eher jeden verhauen, der solch ein Konstrukt tatsächlich 
benutzen möchte :)

Das fällt in die Rubrik kann man machen, sollte man aber nicht.

Autor: Bimbo. (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Das ist kein Operator. Das ist identisch mit:
i --> 0;

wird zu 

i-- > 0;

Autor: Servo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

wenn ich es richtig verstehe, dann wird die Variable i jetzt schon vor 
dem Vergleich dekrementiert, anstatt erst am Schleifenwendepunkt. Sollte 
man aber bedenken, wenn man i noch im Schleifenkörper braucht.

Ich persönlich halte von dieser Verkrypterei nicht viel, insbesondere C 
bringt das immer wieder in Verruf.

Viele Grüße,
Servo

Autor: leo (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Servo schrieb:
> wenn ich es richtig verstehe, dann wird die Variable i jetzt schon vor
> dem Vergleich dekrementiert,

Nein. Das ist ganz normales Postdekrement.

> anstatt erst am Schleifenwendepunkt.

Was soll das sein?

leo

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Standardkost würde ich jetzt nicht sagen.

Simple assignment, postfix decrement und relational operator gibts so 
seit mindestens 30 Jahren (ich vermute mal dass er auf diese 3 
Operatoren raus will). Kaum ein Programm kommt ohne die aus, 
0815-Standardkost. Wer die nicht (er)kennt, kennt nicht wirklich was.

Nix für ungut.

Autor: Carl D. (jcw2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht sollte man wirklich C++ nutzen.
Es gibt da nämlich auch rückwärts laufende Iteratoren, die das Ganze 
mittels std::for_each() ausdrückbar machen. (falls "rückwärts" das Ziel 
ist)

Edit: seh gerade, StackOverflow meint das auch ;-)

: Bearbeitet durch User
Autor: Jakob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sagt bloß, ihr kennt den down-to Operator nicht mehr
https://www.sololearn.com/Discuss/1601179/have-you-heard-about-down-to-operator

Autor: C. P. P. Lovejoy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ursprüngliche Problem für diese rhetorische Frage war, ein Array 
rückwärts zu durchlaufen.

Wie durläuft man ein Array rückwärts, wenn man das Programmieren gelernt 
hat?, so dass man:

- unsgined int verwenden kann und
- mit den Arraydimensionen arbeiten kann, ohne +/- 1?

Autor: Carl D. (jcw2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C. P. P. Lovejoy schrieb:
> Das ursprüngliche Problem für diese rhetorische Frage war, ein Array
> rückwärts zu durchlaufen.
>
> Wie durläuft man ein Array rückwärts, wenn man das Programmieren gelernt
> hat?, so dass man:
>
> - unsgined int verwenden kann und
> - mit den Arraydimensionen arbeiten kann, ohne +/- 1?

Indem man von rbegin() nach rend() iteriert.

Autor: Guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach komm, der String-Klammer-Operator ist schöner=
int i = 0;
char a = i["abcde"];

Autor: C. P. P. Lovejoy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Carl D. schrieb:
> Indem man von rbegin() nach rend() iteriert.

Wie bekommt man dann den Index?

Autor: C. P. P. Lovejoy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guest schrieb:
> Ach komm, der String-Klammer-Operator ist schöner=

Sind das eigentlich Bugs oder Features in C?

Autor: Carl D. (jcw2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C. P. P. Lovejoy schrieb:
> Carl D. schrieb:
>> Indem man von rbegin() nach rend() iteriert.
>
> Wie bekommt man dann den Index?

Vor dem Rückwärtsiterieren sollte man ansatzweise das Vorwärtsiterieren 
verstehen. Man braucht da keinen Index, der Iterator ist quasi ein 
Zeiger auf das vector/array/...-Element.

Z.B. int-Vector rückwärts ausgeben:
for ( auto i = v.rbegin(); i != v.rend(); i++ ) {
    std::cout << *i << std::endl;
}

C++11 vorausgesetzt.

: Bearbeitet durch User
Autor: leo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Carl D. schrieb:
> Man braucht da keinen Index, der Iterator ist quasi ein
> Zeiger auf das vector/array/...-Element.

Was ist da der Unterschied zu einem Pointer-In(De-)krement? Mehr Syntax?

leo

Autor: Servo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
leo schrieb:
>> wenn ich es richtig verstehe, dann wird die Variable i jetzt schon vor
>> dem Vergleich dekrementiert,
>
> Nein. Das ist ganz normales Postdekrement.

Ja hast recht. Insofern macht das noch weniger Sinn. Ich würde sowas 
auch niemals so hinschreiben, da stolpert man doch drüber. Ein einzelnes 
i--; oder i++; ist doch viel eindeutiger.

>
>> anstatt erst am Schleifenwendepunkt.
>
> Was soll das sein?

Ach komm. Ich weiß wirklich nicht, ob es da ein anderes Wort für gibt, 
aber in diesem Kontext kann ja man sich eindeutig denken was gemeint 
ist. Die for-Schleife ist vorprüfend, und das letzte Statement in der 
for-Klammer wird erst nach der Ausführung des Rumpfes abgearbeitet. An 
dieser Stelle "wendet" dann die Schleife. Daher meine kreative 
Wortschöpfung" :-)

Viele Grüße,
Servo

Autor: Andreas M. (amesser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
leo schrieb:
> Servo schrieb:
>> wenn ich es richtig verstehe, dann wird die Variable i jetzt schon vor
>> dem Vergleich dekrementiert,
>
> Nein. Das ist ganz normales Postdekrement.

In der hier vorgestellten Syntax wird der Check (i>0) und der Dekrement 
(i--) vor dem Ausführen des Schleifenkörpers gemacht, wenn es
for (..; i > 0; i--)

wäre, dann würde der Dekrement nach dem Ausführen des Schleifenkörpers 
gemacht. Ersteres iteriert über [stdv.size() -1; 0], letzteres über 
[stdv.size(); 1].

Ich würde diese Form aber auch nicht nutzen. Da muss man drei mal 
schauen bis man kappiert was da passiert.

Autor: Carl D. (jcw2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
leo schrieb:
> Carl D. schrieb:
>> Man braucht da keinen Index, der Iterator ist quasi ein
>> Zeiger auf das vector/array/...-Element.
>
> Was ist da der Unterschied zu einem Pointer-In(De-)krement? Mehr Syntax?
>
> leo

Z.B. daß v auch ein anderer Container mit Rückwärts-Iterator sein darf, 
ohne daß man einen (überladenen) [] Operator bräuchte.
Ein Iterator kann ein (Smart-)Pointer sein, oder aber auch was ganz 
anderes.

: Bearbeitet durch User
Autor: C. P. P. Lovejoy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Carl D. schrieb:
> C++11 vorausgesetzt.

Danke fürs Beispiel. Schön, dass C schon immer eine Lösung hat, und C++ 
im Zeitgeist frolockt.

Autor: Carl D. (jcw2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C. P. P. Lovejoy schrieb:
> Carl D. schrieb:
>> C++11 vorausgesetzt.
>
> Danke fürs Beispiel. Schön, dass C schon immer eine Lösung hat, und C++
> im Zeitgeist frolockt.

In C++ kann v aber auch ein Objekt sein, das aus stdin liest und dessen 
Iterator über den * Operator das aktuelle Zeichen liefert, via ++ 
Operator das nächste Zeichen liest und dieses via != Operator mit '\n' 
vergleicht. Dann iteriert man mit dem gezeigten Code über die Zeichen 
einer Zeile. Da tut sich der Index schwer.

: Bearbeitet durch User
Autor: Heiko L. (zer0)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Carl D. schrieb:
> C. P. P. Lovejoy schrieb:
>> Carl D. schrieb:
>>> C++11 vorausgesetzt.
>>
>> Danke fürs Beispiel. Schön, dass C schon immer eine Lösung hat, und C++
>> im Zeitgeist frolockt.
>
> In C++ kann v aber auch ein Objekt sein, das aus stdin liest und dessen
> Iterator über den * Operator das aktuelle Zeichen liefert, via ++
> Operator das nächste Zeichen liest und dieses via != Operator mit '\n'
> vergleicht. Dann iteriert man mit dem gezeigten Code über die Zeichen
> einer Zeile. Da tut sich der Index schwer.

Ein reverse-Iterator aber auch... :)

Autor: Wilhelm M. (wimalopaan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jeder Zeiger ist ein Iterator, aber nicht jeder Iterator ist ein Zeiger.

Ein Iterator ist ein abstraktes Konzept (nein, ich meine nicht concepts 
und requirements, denn das Iterator-Konzept ist Uralt in C++). Dieses 
Konzept verlangt eine bestimmte Operationenmenge. Jeder Dytentyp, der 
diese Typanforderungen erfüllt, ist eine Iterator. Und kann auch für die 
Algorithmen der stdlib verwendet werden.

Autor: Volle22 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
übrigens haben Prozessoren mit einer Loop Einheit im Core meist das 
Problem den Schleifenzähler/Iterator nicht in der Load/Store Einheit 
gleichzeitig verwenden zu können.
Wenn man also den Iterator auch  als Array Index verwendet wird kann die 
"Zero Overhead Loop Unit" nicht verwendet werden  => Schleife benötigt 
mehr Takte.

Eine Zweite Variable die auch problemlos in die andere Richtung laufen 
kann ist effizienter.
Die HW-Loop Counter sind meist übrigens Down-Counter.

Autor: Wilhelm M. (wimalopaan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C. P. P. Lovejoy schrieb:
> Das folgende C++ Konstrukt hab ich grad so ähnlich im Netz entdeckt:
>
>
> for (unsigned int i = stdv.size(); i --> 0; )
> {
>   std::cout << stdv[i];
> }
> 
>
> Ich habs weder gekannt, noch auf anhieb verstanden. Da es auch in C
> geht, wollt ichs Euch nicht vorenthalten.
>
> Ist von dort:
> 
https://stackoverflow.com/questions/275994/whats-the-best-way-to-do-a-backwards-loop-in-c-c-c

Dort steht übrigens: "... typographically best ..."

Autor: GEKU (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servo schrieb:
> wenn ich es richtig verstehe, dann wird die Variable i jetzt schon vor
> dem Vergleich dekrementiert, anstatt erst am Schleifenwendepunkt. Sollte
> man aber bedenken, wenn man i noch im Schleifenkörper braucht.

Wenn ich c richtig verstanden habe, dann wird der dritte Parameter im 
"Schleifenkopf"   am Ende  des "Schleifenkörpers" durchgeführt.

Zur Vollständigkeit :

Der erste Parameter im "Schleifenkopf" wird einmal  am Beginn  der 
Schleifeninitalisierung, der Zweite  vor Eintritt  im Schleifenkörper 
durchgeführt.

Autor: Bernd K. (prof7bit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bimbo. schrieb:
> Das ist kein Operator. Das ist identisch mit:
>
> i --> 0;
> 
> wird zu
> 
> i-- > 0;
> 

Der Parser oder Tokenizer oder meinetwegen auch die ganze Grammatik ist 
krank wenn das erlaubt ist ohne einen Syntaxfehler auszuspucken.

/Meinung

Autor: Vincent H. (vinci)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Eingangs gepostete Schleife nutze ich eigentlich sehr gerne. Meiner 
Meinung nach beugt das auch versehentliche Endlosschleifen vor in denen 
unsigned < 0 verglichen wird.


Guest schrieb:
> Ach komm, der String-Klammer-Operator ist schöner=
>
> int i = 0;
> char a = i["abcde"];
> 

Das kannte ich auch nicht...


Und generell bezüglich C++:
Youtube-Video "CppCon 2018: Timur Doumler “Can I has grammar?”"

;)

Autor: René H. (Firma: anonymous) (hb9frh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guest schrieb:
> Ach komm, der String-Klammer-Operator ist schöner=int i = 0;
> char a = i["abcde"];

Und wofür soll der gut sein?

Grüsse,
René

Autor: A. S. (achs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube, da hat jemand ein "schönes" Konstrukt in die falsche 
Schleife gesteckt.

Standard-Anwendungsfall ist
   while(n-->0) ...

Wenn man n bekommt und es nicht als Index braucht. Z.b. n Mal einen Port 
toggeln soll.

: Bearbeitet durch User
Autor: Peter D. (peda)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Bernd K. schrieb:
> Der Parser oder Tokenizer oder meinetwegen auch die ganze Grammatik ist
> krank wenn das erlaubt ist ohne einen Syntaxfehler auszuspucken.

Dabei ist es doch ganz einfach. In C sind Whitespaces und Zeilenumbrüche 
kein Syntaxelement. Sie können also weggelassen werden, solange sich der 
Ausdruck noch eindeutig parsen läßt.
Nur der Mensch braucht sie zur besseren Lesbarkeit. Also ist auch er in 
der Verantwortung, sie sinnvoll zu setzen.

Autor: Wilhelm M. (wimalopaan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vincent H. schrieb:
> Guest schrieb:
>> Ach komm, der String-Klammer-Operator ist schöner=
>>> int i = 0;
>> char a = i["abcde"];
>>
> Das kannte ich auch nicht...

Subscript-Operator
Es ist definiert:
a[b] == *(a + b)

Daher ist
*(a + 5)

und
*(5 + a)
dasselble.

Autor: Walter K. (walter_k488)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nicht"Gast" schrieb:
> Standardkost würde ich jetzt nicht sagen.
>
> Ich würde eher jeden verhauen, der solch ein Konstrukt tatsächlich
> benutzen möchte :)

Jau! Und Fahrrad nur mit Helm besteigen - und an die Strasse bei jeder 
50cm hohen Böschung eine doppelte Leitplanke und nur noch in Warnweste 
und mit Schutzbrille rumrennen!!!

LoL

Autor: M. H. (bambel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C. P. P. Lovejoy schrieb:
> for (unsigned int i = stdv.size(); i --> 0; )

Ich verstehe nicht genau, was hier neu sein soll?
Habe nciht alles gelesen. Das sieht mir aber nach altem Hut aus. Kein 
neuer Operator.

i-->0 ist lediglich (i--)>0
Und das ist:
* Dekrementiere i
* liefere Vergleich, ob i (vor dem dekrement) größer als 0

Stichwort: Operator Precedence. Soltle man grob kennen von den Sprachen, 
die man verwendet.

und dann eben vor jedem Schleifendurchlauf durchgeführt (Zweites 
Statement in den Klammern der for-Schleife) und der Einsprung in den 
Schleifenkörper findet nur statt, wenn der Ausdruck != 0 liefert.

Ich stelle leider immer wieder fest, dass die Grundfesten von C, 
speziell eine for-Schleife, bei den meisten nicht richtig gelehrt 
wurden.

for (a; b; c) d;

1) Als erstes wird das Statement "a" ausgeführt.
2) Dann wird zur Prüfung der Einsprungbedingnung übergegangen. Dazu wird 
"b" ausgeführt. Der Rückgabewert von was auch immer da steht, 
entscheidet, ob der Schleifenkörper "d" ausgeführt wird.
3) Am Ende wird Statement "c" ausgeführt.
4) => Weiter bei Punkt 2)

Viele scheinen darauf festgenagelt zu sein, dass
1) a nur eine Initialisierung,
2) b nur eine Bedingung / Vergleich
3) und c nur ein Inkrement/Dekrement sein kann.

Da kann jedoch jedes beliebige Statement stehen.

Dazu ein kleines Beispiel:
Die Elemente einer verkettete Liste 'list_head' mit der Struktur
struct list_item {
 void *data;
 struct list_item *next;
}
können bspw. so gezählt werden (ja ich weiß, verkettete Listen sind 
langsam und skalieren schlecht):
int len;
struct list_item *iter;

for (len = 0, iter = list_head; iter; iter = iter->next, len++);

: Bearbeitet durch User
Autor: Wilhelm M. (wimalopaan)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
M. H. schrieb:
> Ich verstehe nicht genau, was hier neu sein soll?
> Habe nciht alles gelesen.

Hättest Du machen sollen. Dann wäre alles klar gewesen.

Autor: Peter D. (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
M. H. schrieb:
> for (a; b; c) d;

Zu beachten ist aber, daß mit continue zu c gesprungen wird.
Bei do/while und while springt continue dagegen zum Vergleich.

Autor: BringMischWerkstatt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd K. schrieb:
> Der Parser oder Tokenizer oder meinetwegen auch die ganze Grammatik ist
> krank wenn das erlaubt ist ohne einen Syntaxfehler auszuspucken.

Interpunktion ist jetzt auch nicht Deine Stärke.

Autor: Wilhelm M. (wimalopaan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
M. H. schrieb:
> Viele scheinen darauf festgenagelt zu sein, dass
> 1) a nur eine Initialisierung,
> 2) b nur eine Bedingung / Vergleich
> 3) und c nur ein Inkrement/Dekrement sein kann.

M. H. schrieb:
> Da kann jedoch jedes beliebige Statement stehen.

Bei a) stimmt das so leider nicht.

Hier sind nur expression-statements und simple-declarations erlaubt.

M. H. schrieb:

> for (len = 0, iter = list_head; iter; iter = iter->next, len++);

Hier hast Du also für a) den Komma-Operator eingesetzt 
(expression-stmt).

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

Bewertung
1 lesenswert
nicht lesenswert
C. P. P. Lovejoy schrieb:
> C/C++: Kennt ihr diesen "Operator" schon?

Ein kurzes "Häh?" hat mit dieses --> schon entlockt :)

Aber auch wenn das korrekt ist, würde ich dennoch die Schreibweise

for (unsigned int i = stdv.size(); i-- > 0; )

bevorzugen, um anderen den "Häh?"-Effekt zu ersparen. Da ich unäre
Operatoren immer direkt (ohne Leerzeichen) an den Operanden hefte und
binäre Operatoren meist beidseitig mit Leerzeichen von den Operanden
trenne, ergibt sich diese Schreibweise bei mir ganz von selber.

Bernd K. schrieb:
> Der Parser oder Tokenizer oder meinetwegen auch die ganze Grammatik ist
> krank wenn das erlaubt ist ohne einen Syntaxfehler auszuspucken.

In den meisten Programmiersprachen können mehrere Operatoren direkt
hintereinander geschrieben werden, da sie neben ihrer eigentlichen
Funktion auch als Delimiter fungieren. So ist bspw.

a <-- b

in C, C++, Java, Python, Ruby, Pascal u.v.m. ein legaler Ausdruck, der
in C, C++ und Java äquivalent zu
a < (--b)

und in Python, Ruby und Pascal (wo es kein -- gibt) äquivalent zu

a < (-(-b))

ist.

So gesehen ist jede der genannten Sprachen "krank" ;-)

Eine der wenigen "gesunden" Ausnahmen stellt Haskell dar: Dort wird das
<-- tatsächlich als ein einzelner Operator geparst, der aber – da nicht
in der Standardbibliothek enthalten – selbst definiert werden muss. Soll
das Verhalten von Python, Ruby und Pascal nachgebildet werden, lautet
diese Definition ganz einfach

x <-- y   =   x < -(-y)

Dann ist 4 <-- 4 == False und 3 <-- 4 == True.

Autor: A. S. (achs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Yalu X. schrieb:
> Aber auch wenn das korrekt ist, würde ich dennoch die Schreibweise
>
> for (unsigned int i = stdv.size(); i-- > 0; )
>
> bevorzugen

Als Ausdruck künstlerischer Potenz vielleicht.
Wenn ich mit stdv.size-1 in die Schleife gehen will und auch die 0 haben 
will, dann sollte es auch so schreiben, falls ein Programmierer 
(Nachfolger) und nicht-Künstler das mal lesen muss. Also:
    /* langweilige version */
    for(unsigned int i = stdv.size()-1; i>=0; i--)
Ja, ist ein bisschen länger. Frag einfach mal 5 Leute: Die Funktion gibt 
10 zurück, mit welchen werten i wird die Schleife durchlaufen? und 
schaue, wo sie mehr straucheln.

Autor: Vincent H. (vinci)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. S. schrieb:
> Yalu X. schrieb:
>> Aber auch wenn das korrekt ist, würde ich dennoch die Schreibweise
>>
>> for (unsigned int i = stdv.size(); i-- > 0; )
>>
>> bevorzugen
>
> Als Ausdruck künstlerischer Potenz vielleicht.
> Wenn ich mit stdv.size-1 in die Schleife gehen will und auch die 0 haben
> will, dann sollte es auch so schreiben, falls ein Programmierer
> (Nachfolger) und nicht-Künstler das mal lesen muss. Also:
>
>
>     /* langweilige version */
>     for(unsigned int i = stdv.size()-1; i>=0; i--)
> 
> Ja, ist ein bisschen länger. Frag einfach mal 5 Leute: Die Funktion gibt
> 10 zurück, mit welchen werten i wird die Schleife durchlaufen? und
> schaue, wo sie mehr straucheln.


Satire? :D

Falls nicht, hint:
.LBB0_1:
        jmp     .LBB0_1

: Bearbeitet durch User
Autor: Wilhelm M. (wimalopaan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. S. schrieb:
> Als Ausdruck künstlerischer Potenz vielleicht.
> Wenn ich mit stdv.size-1 in die Schleife gehen will und auch die 0 haben
> will, dann sollte es auch so schreiben, falls ein Programmierer
> (Nachfolger) und nicht-Künstler das mal lesen muss. Also:
>     /* langweilige version */
>     for(unsigned int i = stdv.size()-1; i>=0; i--)

Bamm!!! Juhu, der Klassiker!

: Bearbeitet durch User
Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. S. schrieb:
> for(unsigned int i = stdv.size()-1; i>=0; i--)

Vincent H. schrieb:
> Satire? :D

Wilhelm M. schrieb:
> Bamm!!! Juhu, der Klassiker!

Lassen wir den GCC auch noch einmal nachtreten:

test.c:5:40: warning: comparison of unsigned expression >= 0 is always true [-Wtype-limits]
    5 |   for(unsigned int i = stdv.size()-1; i>=0; i--)
      |                                       ~^~~

Autor: nicht"Gast" (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Walter K. schrieb:
> Jau! Und Fahrrad nur mit Helm besteigen - und an die Strasse bei jeder
> 50cm hohen Böschung eine doppelte Leitplanke und nur noch in Warnweste
> und mit Schutzbrille rumrennen!!!

Du kannst das natürlich halten wie ein Dachdecker.

Einfache Tatsache ist aber, dass eine solche Schreibweise unüblich ist 
und der geneigte Leser erst mal drüber fällt, was da jetzt wirklich 
passiert.

Dazu gibts keine Perfomanceverbesserung gegenüber einer üblichen 
Schreibweise. Ergo -> Schrott der nur Fehler verursacht.

Autor: Sven B. (scummos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: M. H. (bambel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter D. schrieb:
> M. H. schrieb:
>> for (a; b; c) d;
>
> Zu beachten ist aber, daß mit continue zu c gesprungen wird.
> Bei do/while und while springt continue dagegen zum Vergleich.

Ist essentiell das gleiche bzw. sogar dasselbe Verhalten.
continue überspringt den Rest des Statementblocks "d". Bei einer 
for-Schleife kommt dann eben "c" vor "b".

Autor: Heiko L. (zer0)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. S. schrieb:
> Ja, ist ein bisschen länger. Frag einfach mal 5 Leute: Die Funktion gibt
> 10 zurück, mit welchen werten i wird die Schleife durchlaufen? und
> schaue, wo sie mehr straucheln.

Die Antwort, die man hier lernt wäre, dass man das nicht sagen kann, 
weil es implementation-defined ist. Und wenn im Body nicht irgendwas mit 
Seiteneffekt steht sogar UB.

Autor: mh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heiko L. schrieb:
> A. S. schrieb:
>> Ja, ist ein bisschen länger. Frag einfach mal 5 Leute: Die Funktion gibt
>> 10 zurück, mit welchen werten i wird die Schleife durchlaufen? und
>> schaue, wo sie mehr straucheln.
>
> Die Antwort, die man hier lernt wäre, dass man das nicht sagen kann,
> weil es implementation-defined ist. Und wenn im Body nicht irgendwas mit
> Seiteneffekt steht sogar UB.

Wo ist da etwas implementation-defined?

Autor: Heiko L. (zer0)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mh schrieb:
> Heiko L. schrieb:
>> A. S. schrieb:
>>> Ja, ist ein bisschen länger. Frag einfach mal 5 Leute: Die Funktion gibt
>>> 10 zurück, mit welchen werten i wird die Schleife durchlaufen? und
>>> schaue, wo sie mehr straucheln.
>>
>> Die Antwort, die man hier lernt wäre, dass man das nicht sagen kann,
>> weil es implementation-defined ist. Und wenn im Body nicht irgendwas mit
>> Seiteneffekt steht sogar UB.
>
> Wo ist da etwas implementation-defined?

"mit welchen Werten" - das hängt von der Breite des unsigned ints ab. 
Implementation defined.

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heiko L. schrieb:
> Die Antwort, die man hier lernt wäre, dass man das nicht sagen kann,
> weil es implementation-defined ist.

Doch, kann man sagen: Alle Werte im Bereich 0 bis UINT_MAX.

Autor: Heiko L. (zer0)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf M. schrieb:
> Heiko L. schrieb:
>> Die Antwort, die man hier lernt wäre, dass man das nicht sagen kann,
>> weil es implementation-defined ist.
>
> Doch, kann man sagen: Alle Werte im Bereich 0 bis UINT_MAX.

Ach so... ich dachte, die Frage zielt auf eine Aufzählung...

: Bearbeitet durch User
Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube, die Frage war sowieso ganz anders gedacht.

Autor: Heiko L. (zer0)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf M. schrieb:
> Ich glaube, die Frage war sowieso ganz anders gedacht.

Klar. Da fragt man sich, wie lange es wohl dauert, bis der Fehler 
auffällt.

<-- Hahahaha!

Zum Beispiel einem Build-Server.

: Bearbeitet durch User
Autor: Markus E. (engelmarkus)
Datum:
Angehängte Dateien:

Bewertung
1 lesenswert
nicht lesenswert
Yalu X. schrieb:
> Ein kurzes "Häh?" hat mit dieses --> schon entlockt :)
Insbesondere wenn man eine Code-Schriftart mit den passenden Ligaturen 
verwendet ;) .

Eigentlich hatte ich ja gehofft, es geht um den operator<=>...

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.