Diskuze: Začínání od 0

Ostatní jazyky Ostatní programovací jazyky Začínání od 0

Avatar
Ondřej Krsička
Redaktor
Avatar
Ondřej Krsička:

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
Redaktor
Avatar
Odpovídá na Ondřej Krsička
tomisoka:

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
Redaktor
Avatar
Odpovídá na Ondřej Krsička
Martin Dráb:

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í
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 9.12.2015 19:40
2 + 2 = 5 for extremely large values of 2
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na tomisoka
Martin Dráb:

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
Ondřej Krsička
Redaktor
Avatar
Odpovídá na tomisoka
Ondřej Krsička:

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
Ondřej Krsička
Redaktor
Avatar
Odpovídá na Martin Dráb
Ondřej Krsička:

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.