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.
offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14824
  • 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.

offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14824
  • 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

offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14824
  • 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();

offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14824
  • 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: 3760
  • 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 983 korisnika na forumu :: 18 registrovanih, 2 sakrivenih i 963 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: anta, bigfoot, bladesu, Botovac, brundo65, cikadeda, comi_pfc, darios, FileFinder, JanaH, Japidson, kybonacci, opt1, Patrik99, RED4G-304, sabros, sap, su27