Avatar
coells
Redaktor
Avatar
coells:27.3.2014 9:46

Tohle je naprosto korektní kód v C:

int p[] = { 10, 20, 30, 40, 50, 0 }, *r = 0[&p], q = 0;

while (0[r])
    q += 0[r++];

printf("%d\n", 0[&q]);
 
Odpovědět  +2 27.3.2014 9:46
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na coells
Zdeněk Pavlátka:27.3.2014 10:26

Jojo, je to super :)

Nahoru Odpovědět 27.3.2014 10:26
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Jakub Zourek
Člen
Avatar
Odpovídá na coells
Jakub Zourek:27.3.2014 12:56

Pěkné. Musel jsem si to nejprve zkompilovat, abych zjistil, co to má dělat. Teprve po několika minutách jsem pochopil, proč to funguje.

 
Nahoru Odpovědět 27.3.2014 12:56
Avatar
Odpovídá na coells
Libor Šimo (libcosenior):27.3.2014 13:12

Takto je to tiež zaujímavé. ;)

#include <stdio.h>

int main(int argc, char *argv[])
{
    int p[] = { 10, 20, 30, 0, 40, 50 }, *r = 0[&p], q = 0;

    while (0[r])
    q += 0[r++];

    printf("%d\n", 0[&q]);

    return 0;
}
Nahoru Odpovědět  +1 27.3.2014 13:12
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Martin Konečný (pavelco1998):27.3.2014 13:37

V C nedělám, mohl by mi někdo říct, co to dělá?

Nahoru Odpovědět 27.3.2014 13:37
Go hard or go home!
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Libor Šimo (libcosenior):27.3.2014 13:46
int main(void)
{
    int p[] = { 10, 20, 30, 40, 50, 0 }; // vytvorí pole int-ov
    int *r = 0[&p]; / do pointeru *r vloží adresu prvého prvku pola p[]
    int q = 0;

    while (0[r]) { // cyklus beží kým v je na adrese prvok väčší ako nula
        q += 0[r++]; // prechádza adresy poľa a spočítava ich
    }

    printf("%d\n", 0[&q]); // vypíše obsah adresy

    return 0;
}

Dúfam, že som to správne popísal.

Nahoru Odpovědět  +1 27.3.2014 13:46
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Tycek
Člen
Avatar
Tycek:27.3.2014 13:52

Zajímavý kód. Pochopil jsem co dělá, ale nějak jsem nepochopil co znamená to pole 0.

Editováno 27.3.2014 13:52
 
Nahoru Odpovědět 27.3.2014 13:52
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Tycek
Zdeněk Pavlátka:27.3.2014 14:29

Pole a index jdou ve výrazu prohodit ;) V tom je celý vtip.

Nahoru Odpovědět  +1 27.3.2014 14:29
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
vitamin
Člen
Avatar
vitamin:27.3.2014 17:45

x[index] a index[x] kompilator transfomuje na *(x+index)
Ten kod je napisany naschval zlozito, zjednodusena verzia:

int p[] = { 10, 20, 30, 40, 50, 0 }, *r = p, q = 0;

while(*r)q += *r++;

printf("%d\n", q);
 
Nahoru Odpovědět  +2 27.3.2014 17:45
Avatar
Libor Šimo (libcosenior):28.3.2014 8:52

Samozrejme, že sa to dá riešiť aj bez pointerov a potom sa do dá použiť aj v iných jazykoch.

int p[] = {10, 20, 30, 40, 50, 0}, r = 0, q = 0;

while (p[r])
    q += p[r++];

printf("%d\n", q); // výstup si vie každý upraviť podľa jazyka
Nahoru Odpovědět 28.3.2014 8:52
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
coells
Redaktor
Avatar
Odpovídá na Libor Šimo (libcosenior)
coells:28.3.2014 12:15

Řešení od C# juniora:

int[] p = new int[] { 10, 20, 30, 40, 50, 0 };
int q = p.Sum();

Řešení od C# seniora:

List<int> p = new List<int>(new int[] { 10, 20, 30, 40, 50, 0 });
int q = p.Sum();

Řešení, když nebereš dostatek vitaminu:

Devbook.cz => Nové vlákno => Mám za úkol sečíst prvky v poli, ale nevím si s tím rady. Kdo mi to napíše?
 
Nahoru Odpovědět  +1 28.3.2014 12:15
Avatar
Nahoru Odpovědět 28.3.2014 12:27
Aj tisícmíľová cesta musí začať jednoduchým krokom.
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 12 zpráv z 12.