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:

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í.

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...