C - pomoc oko dijela koda:

1

C - pomoc oko dijela koda:

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

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



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: 14825
  • 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

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


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

  1. main()
  2. {
  3. int t,a=3,b=7,i, j;
  4. t=a&&b;
  5. i=(t==3);
  6. j=(i==0) ? i : t;
  7. printf("%d %d",i,j);
  8. getch();


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

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

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

тако да је

  1. printf("j = %d\n", a++);

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



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

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



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

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

  1. 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

  1. 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: 14825
  • 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: 14825
  • 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:

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

Ko je trenutno na forumu
 

Ukupno su 1200 korisnika na forumu :: 84 registrovanih, 6 sakrivenih i 1110 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: 4thFlavian, Abebe Bikila, AMCXXL, Asteker, Avalon015, Ba4e, Boris BM, Boris90, branko87, BUDDAR70, darcaud, darkojbn, dekan.m, Denaya, DENIRO, Dimitrise93, dinamik, DonRumataEstorski, dragan_mig31, Fog of War, g_g, GeoM, goranvas, goxin, IQ116, jodzula, Jomini, Još malo pa deda, K-1A, karevski, kljift, Kobrim, kolle.the.kid, Kubovac, Levi, Lucije Kvint, Manjane, Martin543, mean_machine, menges, Metanoja, Miki01, mikrimaus, milimoj, MiroslavD, Murko, neutrino, niksa517, OldKresoje, Orc, Pavk3, pedja63, Petarvu, Povratak1912, PrincipL, Prometeus, RajkoB, Ranutovac, raster12, RJ, sajorg, sale76, Sarmat, sekretar, sslay, stefan95, Str2022, suton, Titan, Token, tubular, tuja, Tumansky, tvlada, Username1000, VanZan, vathra, vensla, vladetije, vuk77, vukan0799, x9, XBMC, zdrebac