[elektro] C csodálkozás
Móczik Gábor
pm_levlista at progzmaster.hu
Tue Oct 1 21:59:37 CEST 2013
2013.10.01. 21:06 keltezéssel, Skandar Graun írta:
> Nem...
> A main() -ból azért nem óhajtanék kilépni... :D
> De ha a mainba teszek egy while(1) ciklust, akkor abból break-kal kell
> kilépni, nem returnnal.
A ciklusból kilépni mindenhol break-kel kell.
A return a függvényből lép ki.
Nagy különbség.
Ha a ciklus után még van valami, break esetén lefut, return esetén nem.
Csak abban a speciális esetben ekvivalens, ha a ciklus után nincs semmi
(a függvény végéig tart) ÉS a függvény visszatérési értéke void.
Példa:
int x(int y)
{
while(1) {
// valami művelet
if (...) {
y=2;
break;
} else {
y=3;
break;
}
}
// valami számítás
y = ...
// valami egyéb művelet
otherfunc(y);
return y;
}
Ha ezt az if-en belül returnnal akarod elérni, akkor a ciklus utáni
közös utasításokat be kell másolni az if mindkét ágába:
int x(int y)
{
while(1) {
// valami művelet
if (...) {
y=2;
// valami számítás
y = ...
// valami egyéb művelet
otherfunc(y);
return y;
} else {
y=3;
// valami számítás
y = ...
// valami egyéb művelet
otherfunc(y);
return y;
}
}
}
Annak ellenére, hogy pontosan ugyanazt csinálja, nem hatékony mert
ugyanaz a kód többször generálódik és nem áttekinthető, mert a lényeg,
hogy y=3 alig látszik, ha netán van 20 utasítás utána. Ha valamiért
később a közös részt módosítani kell, akkor a duplikáció további hibaforrás.
NAGYON nyomós ok kell hozzá, hogy megspóroljuk azt a JMP utasítást amit
a break-hez generál a fordító, mert ezen kívül csak hátránya van,
továbbá igen sanszos, hogy az optimalizálás felismeri a duplikációt és
vsszacsinálja az előbbi formára.
More information about the Elektro
mailing list