C - pomoc oko dijela koda:

1

C - pomoc oko dijela koda:

offline
  • Pridružio: 03 Apr 2016
  • Poruke: 136

#include <stdio.h> main() { int a=5,j; printf("j = %d\n", a++); printf("j = %d\n", --a); printf("%d", a); getch(); }


Ovo je valjda krajnje jednostavno,ali meni kao pocetniku nije jasno nista.

Ako moze neko da mi pojasni sve linije koda.

hvala...



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
online
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14244
  • Gde živiš: Niš

Hajde napiši nam najpre ti kako razumeš ovaj kod, pa ćemo već da te ispravimo ako u nečemu grešiš i pojasnićemo ti nejasne stvari.



offline
  • Pridružio: 03 Apr 2016
  • Poruke: 136

a=5 /* inicijalizovano printf("j = %d\n", a++); /* Ovo se ne ovecava ali mi treba pojasnjenje zasto printf("j = %d\n", --a); /* Ovo se neumanjuje ali mi treba pojasnjenje zasto printf("%d", a); /*stampa vrijednos a koja je 5 getch(); }

To mi je donekle i jasno, ali ovaj dio nije:

main() { int t,a=3,b=7,i, j; t=a&&b; i=(t==3); j=(i==0) ? i : t; printf("%d %d",i,j); getch();

Ovdje mi nista oko i,j nije jasno...

offline
  • Pridružio: 11 Apr 2012
  • Poruke: 98

++a ће увећати вредност промењиве а па ће ти тек онда дати вредност и тиме ћеш добити као резултат а+1 и промењива а ће након инструкције имати исту ту вредност
док а++ ће прво дати вредност промењиве а (док још није додата јединица) па ће тек након тога увећати промењиву а за један
аналогно томе --а и а--.

тако да је
printf("j = %d\n", a++);
исто што и
printf("j = %d\n", a); а = а + 1;


док је
printf("j = %d\n", --a);
исто што и
a = a - 1; printf("j = %d\n", a);


тако је а повећано тек након што се први пут иштампало а затим је смањено пре него што се други пут иштампало и због тога ти на екрану излизи само вредност 5.

online
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14244
  • Gde živiš: Niš

rocknrola ::printf("j = %d\n", a++); /* Ovo se ne ovecava ali mi treba pojasnjenje zastoZbog toga što je u pitanju postinkrementalni operator. On se izvršava po završetku operacije štampanja.
rocknrola ::printf("j = %d\n", --a); /* Ovo se neumanjuje ali mi treba pojasnjenje zastoSiguran si da ne? Ovde je u pitanju predekrementalni operator. On se izvršava pre operacije štampanja.

Ono što je problem kod druge operacije je posledica ovakve sekvence koda. U liniji printf("j = %d\n", a++); se vrši uvećavanje promenljive a za 1, pa po završetku izvršenja ove linije a ima vrednost 6. Nakon toga se u sledećoj liniji a najpre dekrementira za 1, te u trenutku štampanja ima vrednost 5. Zbog toga te je to dovelo u zabludu da --a ne dekrementira vrednost promenljive a.

offline
  • Pridružio: 03 Apr 2016
  • Poruke: 136

Napisano: 08 Nov 2016 13:35

Znaci da ce mi stampati:
5
5
5

Dopuna: 08 Nov 2016 13:36

vasa.93 ::rocknrola ::printf("j = %d\n", a++); /* Ovo se ne ovecava ali mi treba pojasnjenje zastoZbog toga što je u pitanju postinkrementalni operator. On se izvršava po završetku operacije štampanja.
rocknrola ::printf("j = %d\n", --a); /* Ovo se neumanjuje ali mi treba pojasnjenje zastoSiguran si da ne? Ovde je u pitanju predekrementalni operator. On se izvršava pre operacije štampanja.

Ono što je problem kod druge operacije je posledica ovakve sekvence koda. U liniji printf("j = %d\n", a++); se vrši uvećavanje promenljive a za 1, pa po završetku izvršenja ove linije a ima vrednost 6. Nakon toga se u sledećoj liniji a najpre dekrementira za 1, te u trenutku štampanja ima vrednost 5. Zbog toga te je to dovelo u zabludu da --a ne dekrementira vrednost promenljive a.



Pojasnjeno,
sad mi je vec jasno.

Jos kad budete imali vremena ovaj drugi deo da mi pojasnite Smile

online
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14244
  • Gde živiš: Niš

Ja za drugi deo takođe čekam da najpre ti napišeš kako shvataš sve to. Smile

offline
  • Pridružio: 03 Apr 2016
  • Poruke: 136

Napisano: 08 Nov 2016 13:38

Gedza98 ::++a ће увећати вредност промењиве а па ће ти тек онда дати вредност и тиме ћеш добити као резултат а+1 и промењива а ће након инструкције имати исту ту вредност
док а++ ће прво дати вредност промењиве а (док још није додата јединица) па ће тек након тога увећати промењиву а за један
аналогно томе --а и а--.

тако да је
printf("j = %d\n", a++);

исто што и
printf("j = %d\n", a);
а = а + 1;


док је
printf("j = %d\n", --a);

исто што и
a = a - 1;
printf("j = %d\n", a);


тако је а повећано тек након што се први пут иштампало а затим је смањено пре него што се други пут иштампало и због тога ти на екрану излизи само вредност 5.


Potpuno jasno nakon Vasih objasnjenja.
Zahvaljujem Smile

Dopuna: 08 Nov 2016 13:40

Za drugi dio mi je jasna samo inicijalizacija Sad

t=a&&b; /*Ovo je logicke operator i, znaci a puta b ??
i=(t==3); /* Ovo mi nije jasno i=3 ?
j=(i==0) ? i : t; /* Ako je i nula ona je j isto sto i i ?
printf("%d %d",i,j);
getch();

online
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14244
  • Gde živiš: Niš

rocknrola ::t=a&&b; /*Ovo je logicke operator i, znaci a puta b ??Puta? Odakle ti množenje? Shocked
Logički operatori se primenjuju nad logičkim vrednostima, a takođe i vraćaju logičku vrednost. Sasvim logično, zar ne? Very Happy Dakle, a i b se posmatraju kao logičke vrednosti, i vrednost koja se dodeljuje promenljivoj t je takođe logička vrednost. Ono što je bitno pomenuti tu je verovatno ono što je pomenuto na času koji si zasigurno propustio. Smile Konverzija logičke vrednosti u celobrojnu vrednost, i obrnuto, je u programskom jeziku C implicitna. Sad samo treba da istražiš malo na tu temu, i sve ostalo će ti biti jasno. Smile
rocknrola ::j=(i==0) ? i : t; /* Ako je i nula ona je j isto sto i i ?Ista priča važi i ovde. Potrebno je samo potražiti informaciju o ternarnom operatoru, i već ti se samo kazati o čemu je reč. Very Happy

offline
  • PHP developer
  • Pridružio: 22 Mar 2006
  • Poruke: 3545
  • Gde živiš: 127.0.0.1

vasa.93 ::rocknrola ::printf("j = %d\n", --a); /* Ovo se neumanjuje ali mi treba pojasnjenje zastoSiguran si da ne? Ovde je u pitanju predekrementalni operator. On se izvršava pre operacije štampanja.

Zapravo se umanjuje, ali se ne vidi Wink bas zbog onog a++ gore - prvo je odstampao vrednost a (5), a onda je uvecao za jedan (6). Medjutim, nigde u medjuvremenu ne stampa vrednost a pa ne zna da joj je sada vrednost 6, da bi se pre stampanja umanjila za 1 i dobila vrednost 5.

Odnosno, linija po linija:
#include <stdio.h> main() { int a=5,j; /*a je 5, ne stampa nista */ printf("j = %d\n", a++); /* stampa 5, a je 6 (prvo stampa pa uvecava) */ printf("j = %d\n", --a); /* stampa 5, a je 5 (prvo smanjuje pa stampa) */ printf("%d", a); /* stampa 5, a je 5

Ko je trenutno na forumu
 

Ukupno su 1160 korisnika na forumu :: 49 registrovanih, 7 sakrivenih i 1104 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 1798 - dana 19 Sep 2019 18:42

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: _commandos_, amaterSRB, antonic.igor2050, Apok, banebeograd, bojank2, branko7, brundo65, BSD2, calvi, darkangel2, darkstar101, djonsule, Dusan Medojevic, Georgius2, GreenMan, ILGromovnik, Kožedub, krkalon, Kubovac, lelemud, lojola, MarKhan, Marko Marković, Maschinekalibar, medvedekbobi123, Mercury, mikrimaus2, milanstankovic087, miljannis, miodrag2, Mixelotti, nemkea71, NoOneEver Dreams, ostoja, Panonsky, powSrb, radionica1, repac, SAA fan, sale755, slonic_tonic, Stanlio, Toni, vasa.93, vathra, wizzardone, yufighter, zlatkoa987