Új hozzászólás Aktív témák

  • dobragab

    addikt

    válasz maestro87 #5683 üzenetére

    "Összetett literális".

    Alaptípusokra, mint amilyen az int, az unsigned long, a double, tudsz a programkódba beágyazott konstansokat írni. Pl: 0, 25UL, 0x0badc0de, 4.6f, 0.001. Speciális literal még a string literal, amit így ismersz: "Hello world!\n".

    Struktúrákra, union-okra, tömbökre C89-ben ilyet csak inicializálásnál tudsz:

    struct Pont p = {5, 12};
    int arr[] = {1, 2, 3, 5, 8, 13, 21};

    p = {12; -5}; // <- ERROR
    p.x = 12;
    p.y = -5; // <- macerás

    C99 behoz ezzel kapcsolatban két feature-t, a compound literal és a designated initializer.

    Compound literal

    Arra való, hogy a programkódban ne csak ilyen alaptípusokat, hanem összetett típusokat is meg lehessen adni egyetlen kifejezésben. Ehhez ugyanaz a szintaxis, mint az inicializálásnál, konyhanyelven annyi különbséggel, hogy a kapcsos zárójel tartalmát az adott típusra kell "cast-olni".

    p = (struct Pont){12; -5};

    struct Pont Pont_tukroz(struct Pont p)
    {
    return (struct Pont){p.y, -p.x};
    }

    struct Pont q = Pont_tukroz((struct Pont){10, 13});

    printf("%p\n", (int[]){1});

    double osszeg = double_osszeg((double[]){1.0, 2.718, M_PI}, 3);

    Ezek a "változók" temporális objektumok, nincs nevük, nem képezheted a címét, mint ahogy ez is értelmetlen:

    printf("%p", &1);

    Élettartamuk a blokk végéig tart (bezáró }), nem úgy, mint C++-ban, ahol a pontosvesszőig (jó, nem pont így van a szabványban, de megközelítőleg pontos).

    Designated initializer

    C-ben a struktúrák adattagjait közvetlenül érjük el, szinte mindig név szerint.

    void Pont_kiir(struct Pont p)
    {
    printf("(%d, %d)", p.x, p.y);
    }

    Kivéve: inicializálásnál.

    struct Pont p = {5, 12};

    Ez egyértelműnek tűnik, az x koordináta 5 lesz, az y pedig 12. De mi történik, ha valami bunkó így definiálta a struct Pont-ot?

    struct Pont
    {
    int y;
    int x;
    }

    Ilyenkor minden működik tovább, kivéve az inicializálást, akkor pont fordítva történnek a dolgok, mint ahogy az ember elképzelte. Ezért vezették be, hogy a struktúrákat inicializálni is lehessen név szerint:

    struct Pont p = {.x = 5, .y = 12};

    Természetesen compound literal-lal együtt is használható.

    p = {.x = 5, .y = 12};

    És nem csak struktúrákra, tömbökre is.

    int arr[] = {[0] = 8, [1] = 13, [2] = 21};

    Sőt, vegyesen is.

    haromszog_rajzol((struct Pont[])
    {
    [0] = {.x = 12, .y = 5},
    [1] = {.x = -12, .y = 5},
    [2] = {.x = 0, .y = 0}
    });

    Jó eséllyel ezeket a te fordítód is támogatja, ha GCC vagy Clang, csak -std=c99 kell neki. MSVC a C99 cuccokat a 2015-ös verzió óta zömmel tudja...

    EQMontoya: bocsi a magyar változónevek miatt :DD

    [ Szerkesztve ]

    Tudom, tudom, akasszak a tökömre egy lámpát, hogy sötétben is tudjak kaszálni.

Új hozzászólás Aktív témák