C hidden features

Vse o programiranju na in za PC

Moderatorji: Kroko, tilz0R

C hidden features

OdgovorNapisal/-a tilz0R » 14 Jun 2017, 23:44

The f**k tole dela. Kaj je to nek hidden feature? ;)

Koda: Izberi vse
int main() {
    int x = 10;
    while (x --> 0) { //Whoot?
        printf("%d ", x);
    }
}
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1814
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 229 krat
Prejel zahvalo: 509 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: C hidden features

OdgovorNapisal/-a xfce » 14 Jun 2017, 23:54

Ne vem, nič posebnega? Mogoče je tako bolj jasno:

Koda: Izberi vse
while ((x--) > 0){}
Oziroma stavek:
while (x > 0){}
dopolniš s tem, da pri spremenljivki še odšteješ -1


Pri tvojem primeru najprej preverja če je x > 0, potem pa še x odšteje - 1, zanka while pa preverja preden se izvrši..
Uporabniški avatar
xfce
 
Prispevkov: 812
Pridružen: 14 Feb 2015, 12:38
Kraj: Poljane nad Škofjo loko
Zahvalil se je: 117 krat
Prejel zahvalo: 231 krat
Uporabnika povabil: S52O
Število neizkoriščenih povabil: 46

Re: C hidden features

OdgovorNapisal/-a VolkD » 15 Jun 2017, 00:23

V C-ju je tako, da če hočeš narediti source nepregleden imaš za to nešteto možnosti, pa bo stvar še vedno delala korektno.
Je to dobro ali slabo, to je pa že drugo vprašanje.
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 41524
Pridružen: 29 Dec 2014, 20:49
Kraj: Kačiče (Divača)
Zahvalil se je: 8986 krat
Prejel zahvalo: 5126 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: C hidden features

OdgovorNapisal/-a zanka » 15 Jun 2017, 05:01

xfce ima prav. Naj dodam, v jeziku C se presledki ne upoštevajo; tudi nove vrstice se ne upoštevajo.
Uporabniški avatar
zanka
 
Prispevkov: 2567
Pridružen: 17 Mar 2016, 01:16
Zahvalil se je: 113 krat
Prejel zahvalo: 254 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 50

Re: C hidden features

OdgovorNapisal/-a s54mtb » 15 Jun 2017, 07:09

Vedeti moraš tudi, katere operacije imajo prednost.
Uporabniški avatar
s54mtb
 
Prispevkov: 11178
Pridružen: 15 Jan 2015, 01:10
Zahvalil se je: 1555 krat
Prejel zahvalo: 4050 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: C hidden features

OdgovorNapisal/-a zanka » 15 Jun 2017, 07:38

Koda: Izberi vse
i = i++;

Koliko bo i?
Uporabniški avatar
zanka
 
Prispevkov: 2567
Pridružen: 17 Mar 2016, 01:16
Zahvalil se je: 113 krat
Prejel zahvalo: 254 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 50

Re: C hidden features

OdgovorNapisal/-a VolkD » 15 Jun 2017, 08:35

zanka je napisal/-a:
Koda: Izberi vse
i = i++;

Koliko bo i?
Povečan za 1.
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 41524
Pridružen: 29 Dec 2014, 20:49
Kraj: Kačiče (Divača)
Zahvalil se je: 8986 krat
Prejel zahvalo: 5126 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: C hidden features

OdgovorNapisal/-a tilz0R » 15 Jun 2017, 08:36

VolkD je napisal/-a:
zanka je napisal/-a:
Koda: Izberi vse
i = i++;

Koliko bo i?
Povečan za 1.


Prehiter si. To je po C standardu undefined behaviour.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1814
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 229 krat
Prejel zahvalo: 509 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: C hidden features

OdgovorNapisal/-a MocnikG » 15 Jun 2017, 08:39

zanka je napisal/-a:
Koda: Izberi vse
i = i++;

Koliko bo i?


Odvisno kolikšen je i pred stavkom. Če je 0 bo za tem stavkom 1.
*Sent*from*my* iPhone.
*Sent*from*my* Linux.
*Sent*from*my* room.
Uporabniški avatar
MocnikG
 
Prispevkov: 487
Pridružen: 18 Maj 2015, 18:56
Kraj: Koroška - MB - CE
Zahvalil se je: 47 krat
Prejel zahvalo: 77 krat
Uporabnika povabil: s55ei
Število neizkoriščenih povabil: 7

Re: C hidden features

OdgovorNapisal/-a zanka » 15 Jun 2017, 08:47

Ta primer me spomni na krokov primer, kjer je imel vmes funkcijo in še kazalce.
Koda: Izberi vse
*i = nekaj(*i++);

In seveda ni delovalo.
Uporabniški avatar
zanka
 
Prispevkov: 2567
Pridružen: 17 Mar 2016, 01:16
Zahvalil se je: 113 krat
Prejel zahvalo: 254 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 50

Re: C hidden features

OdgovorNapisal/-a mujo » 15 Jun 2017, 08:53

zanka je napisal/-a:
Koda: Izberi vse
i = i++;

Koliko bo i?

i bo imel nespremenjeno vrednost.

tilz0R je napisal/-a:Prehiter si. To je po C standardu undefined behaviour.

Si pepričan?
mujo
 
Prispevkov: 734
Pridružen: 21 Jan 2015, 10:50
Kraj: MB
Zahvalil se je: 1 krat
Prejel zahvalo: 150 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 18

Re: C hidden features

OdgovorNapisal/-a tilz0R » 15 Jun 2017, 08:56

mujo je napisal/-a:Si pepričan?


Prepričan. Sequence point ni definiran.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1814
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 229 krat
Prejel zahvalo: 509 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: C hidden features

OdgovorNapisal/-a Kroko » 15 Jun 2017, 09:17

Vidim, da je moje "teženje" koristilo in da se je tilz0R nekaj naučil :-)

Kratka razlaga gre pa takole:
Vse kar je med dvema "sequence point"-oma ima v C-ju nedefiniran vrstni red izvajanja. Podpičje (konec stavka) je sequence point. Prav tako klic funkcije. Dodeljevanje (=) ni "sequence point" in posledično je tak stavek nedefiniran. Ali na kratko - ne sme se v enem stavku dvakrat spreminjati vrednosti spremenljivke.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4771
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1647 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: C hidden features

OdgovorNapisal/-a xfce » 15 Jun 2017, 09:22

Koda: Izberi vse
i = i++;


če hočeš, da tole deluje, moraš narediti to:
Koda: Izberi vse
i = ++i;

v tem primeru najprej izračuna (++i) in šele potem prišteje.

Koda: Izberi vse
    int i=0;
    printf("Hello int :)\n");
    printf("num:%i\n",i);
    i = i++;
    printf("num:%i\n",i);
    i = ++i;
    printf("num:%i\n",i);

    return 0;


Rezultat:
Koda: Izberi vse
int i=0;
Hello int :)
num:0
num:0
num:1
Uporabniški avatar
xfce
 
Prispevkov: 812
Pridružen: 14 Feb 2015, 12:38
Kraj: Poljane nad Škofjo loko
Zahvalil se je: 117 krat
Prejel zahvalo: 231 krat
Uporabnika povabil: S52O
Število neizkoriščenih povabil: 46

Re: C hidden features

OdgovorNapisal/-a Kroko » 15 Jun 2017, 09:36

Koda: Izberi vse
i = ++i;

Je tudi nedefiniran in ravno tako "nevaren" kot i = i++;

Ali na kratko - ne sme se v enem stavku dvakrat spreminjati vrednosti spremenljivke


Jaz dobim takole:
Koda: Izberi vse
Hello int :)
num:0
num:1
num:2
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4771
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1647 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: C hidden features

OdgovorNapisal/-a tilz0R » 15 Jun 2017, 11:22

xfce,

en prevajalnik bo naredil tako kot imaš v mislih, drugi mogoče nebo. To je UB in lahko varira med prevajalniki.

Kroko

Nikoli nisem bil proti tebi glede sekvence :)

Ta post sem objavil samo zato, ker se mi je zdel zanimiv, ker je sintaksa lahko drugačna, oz. izgleda drugače.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1814
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 229 krat
Prejel zahvalo: 509 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255


Vrni se na Programski jeziki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost