Stránka 1 z 1
Jazyk C - otazky
Napsal: stř 21. lis 2007, 10:04
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?
Napsal: stř 21. lis 2007, 11:21
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
Napsal: stř 21. lis 2007, 12:09
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?
Napsal: stř 21. lis 2007, 12:22
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:
Je to síce správne, sčítanie sa vykoná, ale výsledok 2 sa potom hneď zahodí.
Napsal: stř 21. lis 2007, 23:39
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...
Napsal: pát 23. lis 2007, 22:16
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...
Napsal: pát 23. lis 2007, 22:21
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;"
Napsal: sob 24. lis 2007, 00:40
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č.
Napsal: sob 24. lis 2007, 18:22
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
Napsal: sob 24. lis 2007, 19:03
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
Napsal: sob 24. lis 2007, 19:50
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...
Napsal: ned 25. lis 2007, 21:20
od €agle
Aha

No proste si najdi informace o polich (array) a hned ti to bude jasnejsi...