Miért használnak egyesek for ciklus helyett while ciklust számláláshoz?
Van-e esetleg ennek valami hatékonyságbeli oka, vagy csak egyszerű szimpátia?
Tehát például ehelyett: for (int i = 0; i < 20; i++) { cout << i << endl; } van, aki ezt használja: int i; while (i < 20) { cout << i << endl; i++; }
std::vector<int> v;
// Sokan írnak ilyet, ami részben hibás mivel a vector méretét tartalmazó változó nem int típusú hanem std::vector<int>::size_type
for(int i = 0; i < v.size(); ++i)
{
//...
}
// Kiírni általában ezeken a módokon szokás
// simán iteratoral
for(std::vector<int>::const_iterator it = v.cbegin(); it < v.cend(); ++it)
{
std::cout << *it << '\n';
}
// range-based for, c++11 -től
for(const std::vector<int>::value_type& value : v)
{
std::cout << value << '\n';
}
// függvénnyel
std::copy(v.cbegin(), v.cend(), std::ostream_iterator<int>(std::cout, "\n"));
// vagy
std::for_each(v.cbegin(), v.cend(), [&v, i = 1](const auto& value) mutable { std::cout << "Sor " << i++ << ": " << value << '\n'; });
Sokféleképpen lehet még végigiterálni valamin, illetve az auto -t ízlés szerint lehet használni a hosszú típusnevek helyett. Ami pedig a legfontosabb, hogy ha értelmes kérdésed van akkor azt szakértői fórumon tedd fel, pl. prog.hu -n ha hozzáértő emberektől szeretnél választ kapni.
"A for ciklus az számlálós ciklus, a while meg nem az."
A for ciklus felhasználását tekintve (konvenció szerint) számlálós ciklus, de funkcionalitásában csak a while ciklus kibővítése. Ha tudod igazolni ennek az ellenkezőjét (nem fogod tudni, mivel ahhoz az kéne, hogy alacsony szinten [mondjuk egy Assemblyben] szintén létezzen a 'for ciklus' fogalma, ami persze nem létezik) akkor kapsz egy kekszet. Mint már megmutattam,a for ciklussal teljesen kiváltható a while ciklus, ha akarjuk, és a while ciklust picit kibővítve megkapjuk a for ciklust. A legtöbb C típusú nyelvben legalábbis. Tehát mi is az, ami annyira megkülönbözteti a for ciklust?
"Kipróbáltam c# Ben és nem fut le a for egyszer sem ha a benne levő feltétel egyből hamis."
Ezzel csak az a baj, hogy ha a benne lévő feltételt vizsgálja, akkor már legalább egyszer le is futott, tehát nem lehet azt kijelenteni, hogy egyszer sem futott le.
A do-while pedig soha nem volt hátultesztelős ciklus, az ugyanis a repeat-until. A do-while az bizony - ha barkácsolásaid során ez nem tűnt volna fel - WHILE ciklus. Ha tudnál angolul akkor ezt bármiféle utánajárás nélkül ki tudtad volna deríteni.
repeat -- until = Ismételd (a ciklusmagban foglaltakat) amíg a feltétel be nem következik.
A while ciklus ennek ellentettje, ott akkor és csak akkor lesz végrehajtva a ciklusmag tartalma, amíg a feltétel igaznak nem bizonyul. Ha egyszer sem, akkor a ciklusmag nem fog lefutni soha.
Te egy akkora retardált vagy, hogy remeg a ház.
A do-while a repeat until C-like változata. Majdnem. A különbség, hogy az egyik folytatási, a másik megállási feltételt néz. De mindkettő a ciklus lefutása UTÁN ellenőrzi a feltételt. A for ciklus ellenben MINDIG a ciklusmag előtt. Minden létező nyelvben ahol van for ciklus, az előltesztelős. Ahogy a while is előltesztelős.
Akkora észnek tartod magad, de még azt sem sikerül jól visszamondanod, amit a legelső programozás órán elmondanak bármelyik pusztafalvi iskolában: Van 3 fajta ciklus, sima előltesztelős, sima hátultesztelős, és számlálós, ami szintén előltesztelős. Elég szánalmas, hogy ilyen vérmesen köpködöd a hülyeségeidet, miközben a legalapvetőbb dolgokat sem tudod jól mondani. Szóval mindenki nevében szépen megkérlek: Fogd be a pofádat.
"C++-ban a for ciklus MAJDNEM teljesen ekvivalens az elől tesztelős ciklussal (a continue viselkedése más), de más nyelvekben nem feltétlenül van ez így: a for ciklus átírható más ciklussá, de visszafelé általában NEM.
A for ciklusnak KISEBB a kifejezőereje, de könnyebb olvasni ezért a használata javasolt ott ahol ez lehetséges."
"amit a legelső programozás órán elmondanak bármelyik pusztafalvi iskolában: Van 3 fajta ciklus, sima előltesztelős, sima hátultesztelős, és számlálós, ami szintén előltesztelős."
Az lehet, pusztafalván, de egyetemen, progalapon ez úgy megy, hogy vannak:
- Feltételes ciklusok
- Számlálós ciklusok
Egész egyszerűen a while bizonyos esetekben intuitívabb. Én while ciklust leginkább bash-ben szoktam használni, mikor egy file-t kell soroként feldolgozni. Valahogy így:
cat file | while read line; do
echo $line;
done
Ez for loopban kicsit problematikusabb:
for line in $(cat file); do
echo $line
done
Ez olyankor lehet még nyilvánvalóbb, amikor egy nagyon hosszan összefőzött kifejezésláncot pipe-olunk a loop-ba.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!