C uganka

Vse o programiranju na in za PC

Moderatorji: Kroko, tilz0R

C uganka

OdgovorNapisal/-a tilz0R » 23 Sep 2019, 09:31

Kaj izpiše spodnja koda in zakaj tako dela? Je to le sreča ali tako mora biti?

Koda: Izberi vse
#include <stdio.h>
#include <stdint.h>

void
my_print(int* num) {
  printf("Num: %d\r\n", *num);
}

int main(void) {
  my_print(&(int){123});
  return 0;
}
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1841
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 230 krat
Prejel zahvalo: 521 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: C uganka

OdgovorNapisal/-a forest70 » 23 Sep 2019, 09:49

Izpiše 123
Saj je normalno, funkcija sprejme parameter kot pointer na int
Torej če funkciji hočeš poslat parameter, mu moraš poslat pointer torej &(int), stem mu poveš da je pointer, (123) je vrednost .....
tilz0R je napisal/-a:Kaj izpiše spodnja koda in zakaj tako dela? Je to le sreča ali tako mora biti?

Koda: Izberi vse
#include <stdio.h>
#include <stdint.h>

void
my_print(int* num) {
  printf("Num: %d\r\n", *num);
}

int main(void) {
  my_print(&(int){123});
  return 0;
}
If you pay in bananas, you got monkeys.
Uporabniški avatar
forest70
 
Prispevkov: 2197
Pridružen: 14 Jan 2015, 01:11
Kraj: Koper
Zahvalil se je: 421 krat
Prejel zahvalo: 469 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 123

Re: C uganka

OdgovorNapisal/-a tilz0R » 23 Sep 2019, 10:15

:) razlika je med {123} in (123). Funkcija za izpis naredi pointer de-reference.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1841
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 230 krat
Prejel zahvalo: 521 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: C uganka

OdgovorNapisal/-a forest70 » 23 Sep 2019, 12:13

tilz0R je napisal/-a::) razlika je med {123} in (123). Funkcija za izpis naredi pointer de-reference.

V C-ju se da zakomlicirat do amena, če hočeš, za stvar, ki je čisto enostavna!!!!
Koda: Izberi vse
#include <stdio.h>
#include <stdint.h>

void
my_print(int num) {
  printf("Num: %d\r\n", num);
}

int main(void) {
  my_print(123);
  return 0;
}
If you pay in bananas, you got monkeys.
Uporabniški avatar
forest70
 
Prispevkov: 2197
Pridružen: 14 Jan 2015, 01:11
Kraj: Koper
Zahvalil se je: 421 krat
Prejel zahvalo: 469 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 123

Re: C uganka

OdgovorNapisal/-a zanka » 23 Sep 2019, 17:11

Zanimivo bi bilo videti prevedeno kodo. Verjetno velike razlike ni. Zna se zgoditi (brez optimizacij), da pri vrednosti 123, najprej naloži 123 iz RODATA v register, potem pa ta register poda funkciji.
Uporabniški avatar
zanka
 
Prispevkov: 2658
Pridružen: 17 Mar 2016, 01:16
Zahvalil se je: 115 krat
Prejel zahvalo: 263 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 52

Re: C uganka

OdgovorNapisal/-a tilz0R » 23 Sep 2019, 18:40

zanka je napisal/-a:Zanimivo bi bilo videti prevedeno kodo. Verjetno velike razlike ni. Zna se zgoditi (brez optimizacij), da pri vrednosti 123, najprej naloži 123 iz RODATA v register, potem pa ta register poda funkciji.


Ni fora v optimizaciji funkcije ampak kaj ta zavita oklepaja naredita.

V Cju ne moreš dostopati do cpu registrov, tako da to odpade.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1841
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 230 krat
Prejel zahvalo: 521 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: C uganka

OdgovorNapisal/-a Kroko » 23 Sep 2019, 18:50

Tole ni standardna c koda ampak gre za GNU pogruntavščino imenovano "statement expression". Le ta je vrnjen kot rvalue zato to v gcc dela.
Po c standardu so zaviti oklepaji "compound statement", ki pa tega ne omogoča.

Tega bi se zaradi nestandarda izogibal.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4828
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 690 krat
Prejel zahvalo: 1682 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255


Vrni se na Programski jeziki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 0 gostov