Einsteiger-Verständnisfrage: Völlig kryptischer Code
-
Hallo C(++)-Freunde!
Zur Zeit beschäftige ich mich erstmals in meinem Leben intensiver mit C++ und komme damit so schlecht und recht voran.
Doch an einer Zeile eines größeren Quelltextes scheitere ich völlig:
while (++k<len && a[k]==nil);Es gibt kein vorgelagertes oder nachgelagertes „do“, sodaß ich keinerlei Schleifenstruktur erkenne bzw. erkennen kann, womit mir dieses „while“ völlig nebulös bleibt. Das bestätigt sich auch darin, daß ich diese Zeile auskommentieren bzw. entfernen kann und der Quelltext dennoch compiliert wird (mit dem Borland-C++-Builder). Auch Versuche, diesen Code optisch etwas anschaulicher zu gestalten, um dahinterzusteigen, was eigentlich passiert, wie z.B.
while (k<len && a[k]==nil) k++;führen zwar dazu, daß der Quelltext immer noch compiliert wird und das Programm abläuft, jedoch mit falschem Ergebnis.
Hingegen wird
do k++ while (k<len && a[k]==nil);gar nicht erst compiliert.
Was also macht die oben eingangs geanannte Codezeile?
Besten Dank für die Aufmerksamkeit und für die Mühe der Antwort(en?)!
Freundlicher Gruß
C-Laie
-
Die Schleife zählt k solange hoch bis entweder das Ende des rrays erreicht ist, oder a[k] != nil ist.
++k ist ein Preinkrement und k++ ein Postinkrement, diese unterscheiden sich in der Funktionsweise. Dies ist auch der Grund warum dein Versuch das in eine normale Schleifen-Form zu bringen gescheitert ist.
While Do (nur do while gibt es) gibt es nicht darum geht es auch nicht.
-
C-Laie schrieb:
Es gibt kein vorgelagertes oder nachgelagertes „do“, sodaß ich keinerlei Schleifenstruktur erkenne bzw. erkennen kann, womit mir dieses „while“ völlig nebulös bleibt.
Ja, hier sind zwei unverständliche Sachen kombiniert:
do while Bedingung tuwas loopist in C und C++
while(bedingung) tuwas;und
do tuwas loop while Bedingungist in C und C++
do tuwas; while(bedingung);Also die Kopfgesteuerste Schleife kommt ohne do aus.
Der zweite Trick ist, daß das Semikolon alleine bereits eine erlaubte Anweisung ist (und die tut nichts).
while(bedingung) tunix;ist
while(bedingung) { }aber auch in der lustigen Schreibweise
while(bedingung) ;und wenn man komisch einrückt, sogar
while(bedingung);
-
Ja, danke! While-do löschte ich soeben, das stammt ja aus C#.
Ich werde jetzt mit Deinen Hinweisen versuchen, den Code noch etwas weiter zu „zerpflücken“, bis er in eine für Maschine und Mensch (mich) verständliche Form annimmt.
Edit: Schon die zweite Antwort, danke also an Euch beide!
-
C-Laie schrieb:
Ja, danke! While-do löschte ich soeben, das stammt ja aus C#.
Wie bitte? Das gibts auch in C# nicht.
-
Es ist wie verhext: Kaum fragte ich, funktioniert es. Also
while (k<len && a[k]==nil) ++k;funktioniert nunmehr ebenso wie
while (k<len && a[k]==nil) k++;Da saß mir immer noch C# im Nacken.
Unklar ist mir aber immer noch, warum
do k++ while(k<len && a[k]==nil);vom Compiler abgelehnt wird. Das ist jetzt mehr rhetorisch gefragt, weil ich die Antwort darauf nicht benötige, aber vielleicht ist das ja auch noch ganz einfach - mit wenigen Wörtern - klärbar.
Nochmals danke!
C-Laie
-
HighLigerBiMBam schrieb:
C-Laie schrieb:
Ja, danke! While-do löschte ich soeben, das stammt ja aus C#.
Wie bitte? Das gibts auch in C# nicht.
Dann bitte ich um Nachsicht: Dann war mir das noch von Pascal in Erinnerung.
Es ist eben keinesfalls von Vorteil, sich mit mehreren Programmiersprachen zu beschäftigen, weil man immer mehr durcheinanderbringt. Ist zumindest bei mir so - ein Beobachtung, die ich im übrigen auch bei natürlichen Sprachen machte.
-
Weil bei k++ das Semikolon fehlt.
-
C-Laie schrieb:
do k++ while(k<len && a[k]==nil);do k++; while(k<len && a[k]==nil);do k++; while(k<len && a[k]==nil);
-
Ja, der Apostroph fehlte, nunmehr ist es mir klar, danke!
Wie gesagt, je mehr Programmiersprachen, desto schlimmer wird es. Leider war bei der Compilermeldung „Statement missing ;“ das Apostroph nur allzuleicht zu übersehen.
Danke, danke!
-
Das Semikolon wird aber traurig, wenn Du es Apostroph nennst.
-
volkard schrieb:
Das Semikolon wird aber traurig, wenn Du es Apostroph nennst.

-
Strich Punkt!?

-
Ihr werdet es vielleicht nicht glauben, aber das fiel mir heute nacht (!) von allein ein, daß ich das arme Semikolon evtl. auch noch falsch titulierte. Gestern war aber auch wirklich sehr wenig mit mir los - Asche auf mein Haupt!
-
Wenn das Apostroph runterfällt und deswegen ein Suchflieger startet, um es zu suchen, könnte sich kurzzeitig die Konstellation ergeben, dass es wie ein Semikolon aussieht:
t0: ´ t1: · t2: , t3: , · t4: , · t5: , · t6: , · t7: , · t8: ,· t9: ;
-
C-Laie schrieb:
Es ist wie verhext: Kaum fragte ich, funktioniert es. Also
while (k<len && a[k]==nil) ++k;funktioniert nunmehr
Der Code ist aber nicht äquivalent. Beim Original, hier nochmal zur Erinnerung
while (++k<len && a[k]==nil);wird k bereits vor dem ersten Schleifendurchlauf einmal inkrementiert. Du machst also jetzt einen Durchlauf mehr. Und wenn das erste k (k=0 nehme ich an, aber das hast du nicht mitgeteilt) die Bedingung bereits wahr werden lässt, dann ist das auch das Ergebnis, was im Original nicht der Fall wäre. Äquivalent wäre
k++; while (k<len && a[k]==nil) k++;