[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