Nooit eerder gezien C++ for loop

Nooit eerder gezien C++ for loop

De toestand van de for lus is in het midden - tussen de twee puntkomma's ; .

In C++ is het OK om bijna elke uitdrukking als voorwaarde te stellen:alles dat naar nul evalueert, betekent false; niet-nul betekent true .

In jouw geval is de voorwaarde u-- :wanneer u converteert naar C#, voegt u eenvoudig != 0 toe :

for (u = b.size(), v = b.back(); u-- != 0; v = p[v]) 
    b[u] = v; //                     ^^^^ HERE

Veel nauwkeurige antwoorden, maar ik denk dat het de moeite waard is om de equivalente while-lus op te schrijven.

for (u = b.size(), v = b.back(); u--; v = p[v]) 
   b[u] = v;

Is gelijk aan:

u = b.size();
v = b.back();
while(u--) {
   b[u] = v;
   v = p[v];
}

U kunt overwegen om te refactoren naar het while()-formaat terwijl u naar C# vertaalt. Naar mijn mening is het duidelijker, minder een valkuil voor nieuwe programmeurs en even efficiënt.

Zoals anderen al hebben opgemerkt -- maar om mijn antwoord compleet te maken -- om het in C# te laten werken, moet je while(u--) wijzigen tot while(u-- != 0) .

... of while(u-- >0) voor het geval je negatief begint. (OK, b.size() zal nooit negatief zijn -- maar overweeg een algemeen geval waarin misschien iets anders u geïnitialiseerd heeft).

Of, om het nog duidelijker te maken:

u = b.size();
v = b.back();
while(u>0) {
   u--;
   b[u] = v;
   v = p[v];
}

Het is beter duidelijk te zijn dan bondig te zijn.


De voorwaarde is u--; , omdat het op de tweede positie staat van de voor instructie.

Als de waarde van u--; verschilt van 0, wordt het geïnterpreteerd als true (d.w.z. impliciet gecast naar de booleaanse waarde true ). Als in plaats daarvan de waarde 0 is, wordt deze gecast naar false .

Dit is een zeer slechte code.

Bijwerken: Ik besprak het schrijven van "for" loops in deze blogpost. De aanbevelingen kunnen in de volgende paragrafen worden samengevat:

Dit voorbeeld is duidelijk in strijd met deze aanbevelingen.