Portál AbcLinuxu, 19. dubna 2024 23:24


Dotaz: Vysvětlení kódu

30.1.2014 19:29 Dan
Vysvětlení kódu
Přečteno: 284×
Odpovědět | Admin
Zdravím, prosím mohl by mi někdo vysvětlit jaktože mi z tohoto kódu http://pastebin.com/zFivX3na vyjde: 23____8 17___15
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

AraxoN avatar 30.1.2014 19:41 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
Rozbalit Rozbalit vše Re: Vysvětlení kódu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Lebo máš skompilovaný iný kód, než to čo si dal na pastebin. Výsledok kódu z pastebin je:
  6  12
  3  12
30.1.2014 19:53 Dan
Rozbalit Rozbalit vše Re: Vysvětlení kódu
Jo pardon, hodil jsem jiný odkaz. Správný je: http://pastebin.com/Xm3eCzAV
Fuky avatar 30.1.2014 20:37 Fuky | skóre: 52 | blog: 4u
Rozbalit Rozbalit vše Re: Vysvětlení kódu
#include <stdio.h>
#include <stdlib.h>
 
void funkce(int *a, int b)
{
    // b = 17 / 2 = 8
    int y = b;
 
    // 7 + 8 = 15
    *a += y;

    // 15 + 8 = 23
    b = *a + y;
    printf("%d%5d\n", b, y);

    // nema vyznam
    y = b + *a;
}
 
int main(void)
{
    int x = 17, y = 7;
 
    funkce(&y, x/2);

    // x = 17 protoze se predala fci pouze hodnota x, a fce si alokovala svoji lokalni promenou b
    // y = 15 protoze se predal fci ukazatel, takze muze fce menit hodnotu y
    printf("%d%5d", x, y);
}

BTW: Příště vkládej kód přímo na Ábíčko, ať z případné odpovědi a diskuze mají časem něco i ostatní, v době, kdy už Tvůj link nebude funkční.

30.1.2014 20:39 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Vysvětlení kódu

Možná bude lepší, když vysvětlíte vy, proč si myslíte, že by měl výstup vypadat jinak, a my vám pak řekneme, kde je ve vaší úvaze chyba. A nebo si to rovnou odkrokujte v debuggeru…

P.S.: na rozumný coding style je lepší si zvykat hned od začátku

Beda0 avatar 30.1.2014 21:02 Beda0 | skóre: 29
Rozbalit Rozbalit vše Re: Vysvětlení kódu
Funkce má dva parametry - první je pointr(ukzatel) což je adresa na které je uložena hodnota dané proměnné. *a znamená, že to z adresy (která je uložená v a) vezme hodnotu, která na ní je uložená. &y znamená, že to vezme adresu, na které je uložená proměnná y. * je inverzí k &

První výpis je z printf uvnitř funkce. na začátku funkce(...) jsou jí předány parametry a = 7, b = 8; a je jasný, b = 17/2 = (int)8.5 = 8 - při přetypování se nezaokrouhluje, vše za desetinnou tečkou se zahodí;

druhej řádek funkce y = b je jasný, y = 8;

*a += y; jde přepsat jako a = a + y; a = 7 + 8 = 15;

b = *a + y; jde přepsat jako b = 15 + 8 = 23;

Vypíše b a y tedy 23 a 8;

Druhý výpis je za funkcí, kdy první parametr je předán ukazatelem - takže ho funkce může změnit - do funkce je předána adresa proměnné a změna hodnoty proměnné se projeví i mimo funkci. Druhý parametr je předán hodnotou, takže ho funkce nemůže změnit - do funkce je předána kopie x a při změně x uvnitř funkce se s x mimo funkci nic nestane. po proběhnutí funkce se tedy y změnilo a y = 8; x se nezměnilo, tedy x = 17;
Fuky avatar 30.1.2014 21:11 Fuky | skóre: 52 | blog: 4u
Rozbalit Rozbalit vše Re: Vysvětlení kódu

Já bych ještě doplnil, že vše potřebné je krásně vysvětleno v knize: Pavel Herout - Učebnice jazyka C . Takže další dotazy by jsem doporučil pokládat až po jejím přečtení a zpracování všech příkladů.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.