NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Ondřej Krsička:9.12.2015 19:27

Ahoj, na hodně místech jsem dříve četl, že budeme v cyklech indexovat od 0 a ne od 1 atd. a že se později dozvím proč. Už je to víc jak půl roku a pořád nevím, v čem je to dobré. Je to konvence? Mně naopak přijde, že je to úplně jedno :P :-) Díky za příspěvky, je to velmi filozofické :D.

 
Odpovědět
9.12.2015 19:27
Avatar
tomisoka
Tvůrce
Avatar
Odpovídá na Ondřej Krsička
tomisoka:9.12.2015 19:35

Je to hlavně kvůli tomu, že se pole indexují od 0.

Takhle, co vypadá jako přehlednější kód?

int pole[100];
for(int i=0; i<100; ++i)pole[i] = i;
for(int i=0; i<100; ++i)print(pole[i]);

nebo:

int pole[100];
for(int i=1; i<=100; ++i)pole[i-1] = i;
for(int i=1; i<=100; ++i)print(pole[i-1]);

A teď si ještě představ, že někde tu -1 zapomeneš...

A osobně mi taky přijde, že se s tím lépe počítá.

Editováno 9.12.2015 19:38
 
Nahoru Odpovědět
9.12.2015 19:35
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Ondřej Krsička
Martin Dráb:9.12.2015 19:40

Aktuálně mě napadají výhody hlavně výkonnostní:

  1. test, zda je hodnota nulová, lze, zejména u cyklů typu for provést rychleji než testování na jinou hodnotu (mnoho instrukcí procesoru nastaveuje speciální příznak, že se někde vyskytla nula (např. při dekrementaci proměnné), takže není nutné dělat explicitní porovnávání. To se samozřejmě může projevit u cyklů končících nulou. Překladač ale může vyoptimalizovat (přehodit pořadí) u cyklů nulou nekončících.
  2. Pokud třeba indexuješ v poli, jehož adresa je zarovnaná na nějakou rozumnou hodnotu (128/256 bitů), je možné při implementaci cyků využít vektorové instrukce a tím běh programu urychlit.

Je teda fakt, že když si definuješ třeba pole s možnými indexy od 1 do N, tak překladač se může snažit jej interně indexovat od nuly, ale nevím, zda-li dokáže odhalit všechny případy. Pořád asi bude muset někde odečítat jedničku. A tuhle práci mu můžeš v podstatě zadarmo ušetřit.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
9.12.2015 19:40
2 + 2 = 5 for extremely large values of 2
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na tomisoka
Martin Dráb:9.12.2015 19:42

Např. v Pascalu/Delphi tě k tomu nikdo nenutí, pokud bereme v úvahu jazyky kompilované do nativního kódu.

V Matlabu třeba také ne (tam se čísluje obvykle od 1).

Nahoru Odpovědět
9.12.2015 19:42
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na tomisoka
Ondřej Krsička:9.12.2015 19:59

Jenom drobnost:

for(int i=0; i<100; ++i)pole[i] = i;

dává čísla menší o 1 než

for(int i=1; i<=100; ++i)pole[i-1] = i;

, ale to je drobnost, chápu co jsi tím chtěl říct.

Stejně se vždy budu řídit tím, co se mi bude v danou situaci znát nejpohodlnější.

 
Nahoru Odpovědět
9.12.2015 19:59
Avatar
Odpovídá na Martin Dráb
Ondřej Krsička:9.12.2015 20:04

Vrtule Martine díky za profi odpověď. Vlastně se tím ušetří jedno porovnávání. Až budu mít období "každej ušetřenej tick a bite je dobrej", tak to asi využiju :)

 
Nahoru Odpovědět
9.12.2015 20:04
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.