[quote]
Soultaker schreef op 10 april 2003 @ 22:32:De conditie in een for-lus wordt in C-achtige talen ook de eerste keer gecontroleerd hoor. De volgende twee constructies zijn semantisch equivalent:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
| // for-constructie
for(INITIALISATIE; ITERATIE; !EINDCONDITIE)
{
// OPERATIE
}
// while-constructie
INITIALISATIE;
while(!EINDCONDITIE)
{
// OPERATIE
// ITERATIE
} |
Het verschil zicht puur in de zelfbeschrijvende kwaliteit van de code. Gebruik van een for-statement drukt net iets anders uit dan een while-statement, maar het is niet gezegd dat je per se de een of de ander moet gebruiken.
Ik heb het opgezocht in Kernighan-Ritchie en inderdaad heb je gelijk vwb de test op de eindconditie in C. Ik weet niet hoe ik er dan bij kom, dat die test achteraan de loop zat. Kernighan-Ritchie spreken over equivalente constructies en welke je neemt hangt af van je persoonlijke voorkeur.
Hmmm. Mja, het is er zo ingesleten om while loops te mijden en do while al helemaal, dat ik er eigenlijk niet zo bij nadenk als ik een loop nodig heb, welke constructie te nemen. Ik vind het van mijn kant wel behoorlijk treurig dat ik deze vergissing gemaakt heb

Feit is dat je for-statement in C-achtige talen veel veelzijdiger is dan in andere talen (die zich vaak beperken tot een voorgeprogrammeerde initialisatie, iteratie en eindconditie);
Klopt, daarom zijn die talen ook zo leuk en daarom zijn er mensen die talen uit de mouw van Wirth verafschuwen.
Dat ben ik dus met je eens. Hij zit er toch in, zoals al ik zei, omdat het gebruik van een for-statement een bepaald patroon is, dat door andere programmeurs eenvoudig begrepen wordt. Door het op de juiste manier te gebruiken, beschrijft de code zijn eigen werking beter. Volgens jouw redenatie is een do-while-constructie ook overbodig, omdat je die ook wel met een 'normale' while-constructie (en wat dubbele code) kan construeren. Eigenlijk heb je helemaal geen while-statement nodig als je labels en goto ondersteund (zoals in C het geval is).
Herzienend met de afgestofte, ondergesneeuwde kennis kun je concluderen dat de while overbodig is en de do while niet. (darn, ik twijfel nu ook aan het feit of het niet een serie while's was die 'niet mochten' ipv do while's)
Tja, lullig voor je dat je nu met zo'n trauma opgescheept zit (

grapje, ey) maar dat neemt niet weg dat het nuttig is als verschillende programmeurs eenzelfde stijl aanhouden. Dat maakt het simpelweg eenvoudiger om elkaar's code te lezen (en ook je eigen code terug te lezen). Ook blijkt in de praktijk gewoon dat bepaalde oplossingen beter geschikt zijn in bepaalde situaties dan anderen. Je kunt daar "je neus voor ophalen" maar daar verdwijnen die voordelen niet mee.
Nou, als developers in een groepje werken, dan is het wellicht verstandig wat af te spreken mbt stijl/naamgeving etc. Ik ga me echter niet conformeren aan een of andere standaard voor het illustere geval dat iemand anders ooit de code gaat lezen terwijl ik die standaard verafschuw. Ik programmeer ook nog vrolijk met Hungarian Notation in C# en blijf dat ook doen.
Even nog over die while/for, ik denk wel dat je in C-achtige talen de while links moet laten liggen, omdat je de initialisatie van je teststatement niet in hetzelfde statement hebt, wat leesbaarheid doet doen afnemen (tests of results van functieaanroepen daargelaten, dus bv while(CheckSomething()) {} ).
In de oorspronkelijke versie van C mocht je helemaal geen lokale variabelen in een for-statement declareren. In C99 mag dat weer wel en daar zijn verder ook geen problemen mee, voor zover ik weet. Wel speelt een soortgelijk probleem een rol in C++: in ieder geval de C++ compiler van Microsoft plaatste de for-variabelen (onterecht) in de outer scope.
Klopt. Variabelen declareerde je bovenaan je method, daarna kwam je initialisatie blok en daarna je code. Een while gebruiken is dan dus nog minder interessant. (dat heeft me nog wel het meest moeite gekost in OO talen: variabelen declareren op de plek waar je ze nodig hebt ipv bovenin)
Goed, concluderend is dus dat ene EfBe zn taalconstructies niet kent
* EfBe =