Einsteiger-Verständnisfrage: Völlig kryptischer Code
-
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++;