Jazyk C - otazky

Vývojová prostředí, aplikace, skripty, http://www... síťové programy, internet, sdílení...
Odpovědět
Ucednik
Nováček
Nováček
Registrován: 21. lis 2007

Jazyk C - otazky

Příspěvek od Ucednik »

Prochazim Heroutovou Ucebnici jazyka C. Predesilam,ze jsem nikdy neprogramoval a nemam vubec zadne zaklady,takze budu mit asi primitivni otazky:

inkrement ++
dekrement --

jak spocitam,kdyz pise

int i = 5, j = 1, k;

i++ - i je 6
j = ++i; - j bude 7,i bude 7
j = i++; - j bude 7, i bude 8
k = --j + 2; - k bude 8, j bude 6, i bude 8


jak k temto hodnotam prisel?
Ramirez
Začátečník
Začátečník
Registrován: 10. kvě 2007
Bydliště: Praha 4
Kontaktovat uživatele:

Příspěvek od Ramirez »

Prepis pravidiel inkrementu:
(++x) je to isté, čo (x = x + 1)
(x++) je to isté, čo ((x = x + 1) - 1)


Ak to aplikujem na tvoj príklad:

Kód: Vybrat vše

int i = 5, j = 1, k;

i++;  ...  (i = i + 1) - 1;  ...  (i = 5 + 1) - 1;  ---  i je 6 (- 1 sa zahodí)
j = ++i;  ...  j = (i = i + 1);  ...  j = (i = 6 + 1);  ...  j = i = 7;  ---  j bude 7,i bude 7
j = i++;  ...  j = ((i = i + 1) - 1  ...  j = (i = i + 1) - 1;  ...  j = (i = 7 + 1) - 1;  ...  j = (i = 8 ) - 1;  ...  j = 7;  ---  j bude 7, i bude 8
k = --j + 2;  ...  k = (j = j - 1) + 2;  ...  k = (j = 7 - 1) + 2;  ...  k = (j = 6) + 2;  ...  k = 8;  ---  k bude 8, j bude 6, i bude 8
Ucednik
Nováček
Nováček
Registrován: 21. lis 2007

Příspěvek od Ucednik »

Ok,dik.
Tak to jsem snad pochopil.
Ja si nebyl jisty, zda je to cele jako jeden souvisly priklad anebo kazdy radek zvlast.
Jeste k tomu prvnimu prikladu:
i++;
tady se ta -1 jedna uplne vytrati?To by se pouzilo pouze v delsim vyrazu?
Ramirez
Začátečník
Začátečník
Registrován: 10. kvě 2007
Bydliště: Praha 4
Kontaktovat uživatele:

Příspěvek od Ramirez »

Úplne sa nevytratí, ale keďže výsledok vonkajšej zátvorky ((i = i + 1) - 1) nie je priradený do žiadnej premennej, tak sa jeho hodnota stratí. Je to podobné, akoby si niekde v kóde napísal:

Kód: Vybrat vše

1 + 1;
Je to síce správne, sčítanie sa vykoná, ale výsledok 2 sa potom hneď zahodí.
€agle
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 13. lis 2003
Bydliště: Vlastní 3D svět :)
Kontaktovat uživatele:

Příspěvek od €agle »

++i je preinkrement, tzn nejprve se zvysi i a az nasledne se dela dalsi operace. Jinymi slovy

Kód: Vybrat vše

b = ++a;
je stejne jako
a = a + 1;
b = a;
Priklad:

Kód: Vybrat vše

int a = 5;
int b = ++a;
cout << a; //vypise 6
cout << b; //vypise 6
Naopak i++ je postinkrement, tzn nejprve se vykona operace a az potom se i zvysi. Jinymi slovy

Kód: Vybrat vše

b = a++;
je stejne jako
b = a;
a = a + 1;
Priklad:

Kód: Vybrat vše

int a = 5;
int b = a++;
cout << a; //vypise 6
cout << b; //vypise 5
V pripade --i a i-- je to obdobne...
Eagle3D Engine under developement

Hledáme do firmy schopného ASP/VB.NET/C# programátora, více po SZ
Ucednik
Nováček
Nováček
Registrován: 21. lis 2007

Příspěvek od Ucednik »

€agle píše:++i je preinkrement, tzn nejprve se zvysi i a az nasledne se dela dalsi operace. Jinymi slovy

Kód: Vybrat vše

b = ++a;
je stejne jako
a = a + 1;
b = a;
Priklad:

Kód: Vybrat vše

int a = 5;
int b = ++a;
cout << a; //vypise 6
cout << b; //vypise 6
Naopak i++ je postinkrement, tzn nejprve se vykona operace a az potom se i zvysi. Jinymi slovy

Kód: Vybrat vše

b = a++;
je stejne jako
b = a;
a = a + 1;
Priklad:

Kód: Vybrat vše

int a = 5;
int b = a++;
cout << a; //vypise 6
cout << b; //vypise 5
V pripade --i a i-- je to obdobne...
Jak to podavas ty, tak oboje znamena de facto to same, rozdil pouze v tom, ze inkrement ++a se provede ihned a inkrement a++ az po vykonani operace?
Oboji je + 1, jedno pred a druhe po...
Ucednik
Nováček
Nováček
Registrován: 21. lis 2007

Příspěvek od Ucednik »

dalsi dotaz:
Podmineny (ternarni operator):
u Herouta na str.45 je ukazka podmineneho vyrazu na konverzi znaku na mala pismena:

c = (c >= 'A' && c<= 'Z') ? c + ('a' - 'A') : c;

proc je po otazniku "c + ('a' - 'A') : c;"
neni lepsi (pokud mozno) napsat rovnou "('a' - 'z') : c;"
Ramirez
Začátečník
Začátečník
Registrován: 10. kvě 2007
Bydliště: Praha 4
Kontaktovat uživatele:

Příspěvek od Ramirez »

Nie je to lepšie, pretože výrazy

Kód: Vybrat vše

c = (c >= 'A' && c<= 'Z') ? c + ('a' - 'A') : c; 
/*                     a                    */
c = (c >= 'A' && c<= 'Z') ? ('a' - 'z') : c;
nerobia to isté. Ak si to chceš overiť, tak si na to sprav pomocný program. Líšiť sa budú pre c z veľkej abecedy. Napríklad ak c = 'B', tak prvý výraz dosadí do c := 'b' a druhý výraz tam dosadí asi číslo "mínus počet písmen v abecede".

Pôvodný výraz, teda:

Kód: Vybrat vše

c = (c >= 'A' && c<= 'Z') ? c + ('a' - 'A') : c;
robí asi toľko, že veľké písmená zmenší na malé a s ostatnými písmenami nerobí nič.
Ucednik
Nováček
Nováček
Registrován: 21. lis 2007

Příspěvek od Ucednik »

ok, diky


dalsi dotaz:

str.59

for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
for (k = 0; k < 10; k++) {
if (x[k] == 0)
goto error;
a = a + b[j] / x[k];
}
} /* nevim proc se mi ty zavorky nechtej odsunout */
}
...

radek a = a + b[j] / x[k]; znamena, a (ev.i), b(ev.j) a x(ev.k)

jelikoz jsem samoucednik, nikde predtim jsem to v knize nevidel...
diky
special thx to Ramirez
€agle
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 13. lis 2003
Bydliště: Vlastní 3D svět :)
Kontaktovat uživatele:

Příspěvek od €agle »

Ucednik píše:Jak to podavas ty, tak oboje znamena de facto to same, rozdil pouze v tom, ze inkrement ++a se provede ihned a inkrement a++ az po vykonani operace?
Oboji je + 1, jedno pred a druhe po...
Presne tak to je :)

Co se toho druheho tyce, tak moc nerozumim otazce... a = a + b[j] / x[k]; znamena ze k hodnote v poli A na indexu I se pricte hodnota v poli B na indexu J vydelena hodnotou v poli X na indexu K... Jinak pouzivani goto je prasarna, tak se tomu snaz vyhnout
Eagle3D Engine under developement

Hledáme do firmy schopného ASP/VB.NET/C# programátora, více po SZ
Ucednik
Nováček
Nováček
Registrován: 21. lis 2007

Příspěvek od Ucednik »

€agle píše: Co se toho druheho tyce, tak moc nerozumim otazce... a = a + b[j] / x[k]; znamena ze k hodnote v poli A na indexu I se pricte hodnota v poli B na indexu J vydelena hodnotou v poli X na indexu K... Jinak pouzivani goto je prasarna, tak se tomu snaz vyhnout


je mi jasny,nerozumis otazce, protoze je to primitivni :)

zkratka predtim se to v knize nikde nevyskytovalo, takze nevim, co je pole A, index I apod.
A hodnoty ve formatu "a" se predtim nikde nevyskytovaly...
€agle
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 13. lis 2003
Bydliště: Vlastní 3D svět :)
Kontaktovat uživatele:

Příspěvek od €agle »

Aha :) No proste si najdi informace o polich (array) a hned ti to bude jasnejsi...
Eagle3D Engine under developement

Hledáme do firmy schopného ASP/VB.NET/C# programátora, více po SZ
Odpovědět

Zpět na „Programování a web“