Kezdőoldal » Számítástechnika » Programozás » Baj ha elmarad a return?

Baj ha elmarad a return?

Figyelt kérdés

void típusú függvényeknél és a főfüggvénynél.


Lehet belőle probléma pl összetett programnál?


2020. szept. 14. 16:14
1 2 3
 11/27 anonim ***** válasza:
70%
9-es: a WC-t se kötelező lehúzni, szerintem mégis megteszed mindig
2020. szept. 14. 23:34
Hasznos számodra ez a válasz?
 12/27 anonim ***** válasza:
0%

Nem kell ez a duma a nulláról. Teljeesen fölösleges a visszatérési érték, mert úgy sem kezd vele az oprendszer semmit.

Annyi hülyeséget szórnak itt, hogy az hihetetlen.

2020. szept. 15. 03:20
Hasznos számodra ez a válasz?
 13/27 anonim ***** válasza:

"9-es: a WC-t se kötelező lehúzni, szerintem mégis megteszed mindig"


Ha önlehúzos lenne nem tenném meg. Ugyanilyen C++-ban is. A main-t a fordító alapból return 0-nak veszi és hiba nélkül tér vissza. És nem fordítófüggő - mert ez alapértelmezett :D Minden fordító megcsinálja. Kívétel, ha írsz magadnak egyet és ezt kihagyod. De erről ennyit......


"eljeesen fölösleges a visszatérési érték, mert úgy sem kezd vele az oprendszer semmit."


Kezd vele, csak a fordító automatikusan behelyettesíti....

2020. szept. 15. 11:02
Hasznos számodra ez a válasz?
 14/27 anonim ***** válasza:
38%

Bár C nyelv nem különbözteti meg őket, én szeretem kettéosztani az alprogramokat függvényekre és eljárásokra.


A függvény egy olyan műveletsort ír le, amelynek van eredménye, és mellékhatásként változtat(hat) a program állapotán. Ebben az esetben return utasítással jelezheted az előállt eredményt (ezzel egyszerre be is fejezve a függvény futását), ebben az alakban:

return [kifejezés];

Egy dologra kell figyelni, hogy a kifejezés olyan típusú legyen, mint amit a függvény deklarációjánál megadtál, vagy arra implicit cast-olható legyen (például a függvény úgy van deklarálva, hogy int értéket ad vissza, de te char típusú kifejezést adsz meg a return után).


Az eljárás ezzel szemben egy olyan műveletsort ír le, amely bár a program állapotán változtat(hat), eredményt nem képez. Mivel nincs eredmény, nincs return utasítás... vagy mégis? Egy speciális alakját használhatod, amikor a return kulcsszó után nem áll kifejezés (mivel nincs eredményünk):

return;

Mivel a függvényben használt returnhoz hasonlóan ez is befejezi az eljárás futását, ezt nagyon jól lehet alkalmazni ellenőrzésekre:


#include <stdbool.h>

void do_something(bool do_print)

{

.. if (!do_print) //ezt hívják "fail fast" módszernek

.. .. return;

..

.. puts("Hali!");

}


A kérdésedre válaszolva: az "int main([...])" esetében a returnt elhagyva nincs semmi gond, a fordító a legvégére beír egy return 0; utasítást. A main-en kívül viszont minden más függvény esetében a generált kód viselkedése nem determinisztikus, és a visszatérési értéket használni veszélyes:


int x() {

.. puts("hali");

}


int main()

{

.. int j = x();

.. printf("%d\n", j); //nekem itt 5-öt írt ki.

..

.. return 0;

}


És hogy a main() miért úgy lett kitalálva, hogy egy számot visszaadunk az oprendszer felé? Shell scripting miatt, hogy könnyedén tudj folyamatokat automatizálni már létező programok felhasználásával. Képzeld el, hogy találsz a neten egy tök jó kis command-line programot, amivel mondjuk a youtube-ról tudsz letölteni egy darab videót. És ezzel van két feladat: neked nem kell a videó, csak a zene belőle; valamint nem csak egy zenét akarsz letölteni, hanem az egyik ismerősöd összeírt 30 számot, ami kellene neki. Szóval két programot kell bevetned, mondjuk a youtube-dl-t (a youtube-ról letöltéshez) és az ffmpeg-et (videó hangfájllá konvertálásához). Ha ezen programok fejlesztői értelmes ember módjára állítják az exit code-ot, nagyon jól tudod majd automatizálni a letöltési folyamatot, és figyelheted, hogy az adott program el tudta-e végezni a rá bízott feladatot. És ha olyan nem nulla exit code jön vissza, ami mondjuk hálózati hibára utal, építhetsz rá retry logikát is. (Nyilván ez bagatel példa, mert erre már kész megoldások vannak, de próbáltam real-life példát mutatni.)

2020. szept. 15. 11:07
Hasznos számodra ez a válasz?
 15/27 anonim ***** válasza:

#2 voltam. Aki esetleg nem értette, pl:


void dbl(int* i) {

if (!i) return;

*i *= 2;

}

2020. szept. 15. 11:22
Hasznos számodra ez a válasz?
 16/27 anonim ***** válasza:

Még egy pár szót a main()-ben lévő return-ről:


Ha 0-t adsz vissza, az azt jelenti, hogy a programod sikeresen lefutott. De a programodon múlik, hogy a futás során milyen kivételes helyzetek állhatnak elő, és minden egyes ilyen helyzetnek lehet egy kódja. Vegyünk például egy egyszerű programot, amin bár lehetne sokat optimalizálni, de nem tettem, hogy érthető legyen a működése.


#include <stdio.h>

#include <stdlib.h>


#define ERR_INSUFFICIENT_ARGS 1000

#define ERR_ZERO_DIVIDER_FOUND 1001

#define ERR_NON_INTEGER_INPUT 1002


int main(int argc, char** argv)

{

.. if (argc < 3) {

.. .. fputs("ERROR: You need to provide at least two integers.", stderr);

.. .. return ERR_INSUFFICIENT_ARGS;

.. }

.. ..

.. int result;

.. if (sscanf(argv[1], "%d", &result) != 1) {

.. .. fputs("ERROR: Non-integer value was provided at argument 1.", stderr);

.. .. return ERR_NON_INTEGER_INPUT;

.. }

..

.. int index;

.. for (index = 2; index < argc; index++) {

.. .. int actual;

.. .. if (sscanf(argv[index], "%d", &actual) != 1) {

.. .. .. fprintf(stderr, "ERROR: Non-integer value was provided at argument %d.\n", index);

.. .. .. return ERR_NON_INTEGER_INPUT;

.. .. }

.. ..

.. .. if (actual == 0) {

.. .. .. fprintf(stderr, "ERROR: Zero divider found at argument %d.\n", index);

.. .. .. return ERR_ZERO_DIVIDER_FOUND;

.. .. }

.. ..

.. .. result /= actual;

.. }

..

.. printf("%d", result);


.. return EXIT_SUCCESS;

}


Ez a kis program elvégez egy egész osztási műveletet a megadott parancssori argumentumokkal, amiknek a helyességét szépen ellenőrzi is. Néhány észrevételt tehetsz:

1) Ahelyett, hogy a legvégén azt írtam volna, hogy "return 0;", az stdlib.h-ból származó EXIT_SUCCESS makrót használtam. Ez olvashatóbb kódot eredményez szerintem - ezzel lehet vitatkozni.

2) A program sok helyen hibára futhat. Minden egyes esethez felvettem egy hibakódot, amit az elején #define fordítói direktívával definiáltam.

3) Előfordulhat, hogy ezt a szoftvert ember fogja használni. A neki szánt, emberi ésszel felfogható hibaüzeneteket az erre a célra kitalált "standard error" fájlba írom.

4) Ha a program hibára fut, a hibának megfelelő exit code-ot adom vissza a return utasítással. Éppen ez fogja lehetővé tenni azt, hogy a programomat shell scriptekben is használhassák (jó, nyilván nem egy annyira hasznos program, hogy ennek értelme is legyen, de na...)

2020. szept. 15. 11:45
Hasznos számodra ez a válasz?
 17/27 BeefEater ***** válasza:
12 -es ez szimplán nem igaz. Ott van, le tudod kérdezni és használni. Én kb napi szinten használom (és normálisabb scriptet sem lehet enélkül írni)
2020. szept. 15. 13:41
Hasznos számodra ez a válasz?
 18/27 anonim ***** válasza:

#12-esnek:

[link]

2020. szept. 15. 13:50
Hasznos számodra ez a válasz?
 19/27 anonim ***** válasza:
0%
17, 18: Próbáljatok meg gondolkozni is.
2020. szept. 15. 14:44
Hasznos számodra ez a válasz?
 20/27 BeefEater ***** válasza:
19: Éppen most hagytam abba. Kicsit kifejthetnéd bővebben (ha már anonim vagy).
2020. szept. 15. 14:48
Hasznos számodra ez a válasz?
1 2 3

Kapcsolódó kérdések:




Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!