Diskuze: Proč je C krásně i děsivé zároveň?

C++ C a C++ Proč je C krásně i děsivé zároveň?

Avatar
coells
Redaktor
Avatar
coells:

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

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):

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):

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

 
Nahoru Odpovědět 27.3.2014 13:37
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Libor Šimo (libcosenior):
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:

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:

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:

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):

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:

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