Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kod koji daje neočekivani rezultat

[es] :: Art of Programming :: Kod koji daje neočekivani rezultat

Strane: 1 2 3 4 5 ... Dalje > >>

[ Pregleda: 107571 | Odgovora: 337 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Everback

Član broj: 337738
*.dynamic.isp.telekom.rs.



+34 Profil

icon Kod koji daje neočekivani rezultat19.01.2018. u 08:59 - pre 75 meseci
Postavite ovde kod koji daje neočekivani rezultat. Bilo koji programski jezik (osim Whitespace).

Nešto jednostavno za početak:
Šta je izlaz programa (odgovor bez pokretanja interpretera u roku od 10 sekundi)?

Code:

<?php 
    $x=1; 
    echo $x + ++$x;

 
Odgovor na temu

anon70939

Član broj: 70939
Poruke: 2823



+6883 Profil

icon Re: Kod koji daje neočekivani rezultat19.01.2018. u 10:45 - pre 75 meseci
Nisam programer, ali verovatno neki error, jer ne vidim da se zatvorio taj tag <?php
 
Odgovor na temu

Everback

Član broj: 337738
*.dynamic.isp.telekom.rs.



+34 Profil

icon Re: Kod koji daje neočekivani rezultat19.01.2018. u 10:56 - pre 75 meseci
Ne postoji sintaksna greška. Kod je ispravan. Kod php-a se i ne preporučuje pisanje zatvarajućeg taga ukoliko nije neophodno, jer se može desiti da zbog nekog spejsa iza zatvarajućeg taga nenamerno pošaljemo sadržaj pre hedera...

Rezultat ovog programa je celi broj. Promenljiva x ima inicijalnu vrednost 1. Operator ++ uvećava promenljivu za jedan. Plus sabira vrednosti. Rezultat je _____

P.S.
Napisao sam maločas da bi trebalo da je isti rezultat i kod ostalih jezika iz C familije, pa rekoh da testiram C i JS i rezultat se razlikuje :) C i PHP daju isti rezultat.
 
Odgovor na temu

nemamstan

Član broj: 335040
Poruke: 246



+134 Profil

icon Re: Kod koji daje neočekivani rezultat19.01.2018. u 11:03 - pre 75 meseci
Unarna operacija dobila prioritet.

Code:
<?php 
    $x=1; 
    echo $x - ++$x;

    $x=1; 
    echo $x - --$x;
?>


Mislim da je to pre ko zna kliko godina opisano u dokumentaciji za php.
 
Odgovor na temu

Everback

Član broj: 337738
*.dynamic.isp.telekom.rs.



+34 Profil

icon Re: Kod koji daje neočekivani rezultat19.01.2018. u 11:07 - pre 75 meseci
Da, zato je prethodno rešenje 4. Zašto je ovde 3?
JS:
Code:

   var x=1;
   alert(x + ++x);
 
Odgovor na temu

nemamstan

Član broj: 335040
Poruke: 246



+134 Profil

icon Re: Kod koji daje neočekivani rezultat19.01.2018. u 11:28 - pre 75 meseci
Code:
<?php
    $x=1; 
    echo $x ^ 2;
?>
 
Odgovor na temu

Everback

Član broj: 337738
*.dynamic.isp.telekom.rs.



+34 Profil

icon Re: Kod koji daje neočekivani rezultat19.01.2018. u 11:34 - pre 75 meseci
0001
0010
------
0011
 
Odgovor na temu

Everback

Član broj: 337738
*.dynamic.isp.telekom.rs.



+34 Profil

icon Re: Kod koji daje neočekivani rezultat19.01.2018. u 11:41 - pre 75 meseci
Ovde je dovoljno samo da prepoznate o kom programskom jeziku se radi :)
Code:

DO ,1 <- #13
PLEASE DO ,1 SUB #1 <- #238
DO ,1 SUB #2 <- #108
DO ,1 SUB #3 <- #112
DO ,1 SUB #4 <- #0
DO ,1 SUB #5 <- #64
DO ,1 SUB #6 <- #194
DO ,1 SUB #7 <- #48
PLEASE DO ,1 SUB #8 <- #22
DO ,1 SUB #9 <- #248
DO ,1 SUB #10 <- #168
DO ,1 SUB #11 <- #24
DO ,1 SUB #12 <- #16
DO ,1 SUB #13 <- #162
PLEASE READ OUT ,1
PLEASE GIVE UP
 
Odgovor na temu

Cube25

Član broj: 336770
79.134.255.*



+124 Profil

icon Re: Kod koji daje neočekivani rezultat19.01.2018. u 11:56 - pre 75 meseci
@everback

Code daje uvek ocekivan rezultat -> jer za razliku od ljudi, ima jasno navedena pravila po kojima se taj rezultat dobija, po kojima radi. Eventaulne greske nastaju kod preciznosti... ali to je neka druga tema.
To sto si ti naveo je primer loseg programiranja. Tj. primer bas kako ne treba da se pise code - jer code na prvom mestu treba da bude jasan. Ne bi bio kraj sveta da je kreirana jos jedna promenjiva, i vishe ne bi bilo razmatranja sta ce biti kako interpretirano i gde.

...

[to state the obvious:]
Ovo je primer right first vs left first evaluacije izraza... Tj. u jednom slucaju racunanje izraza pocinje prvo sa desne strane, gde se inicijalni broj ikrementira za 1 i postaje 2, i posle sabira sam sa sobom, sto je (sada 4, jer je u mejuvremenu postao 2 umesto 1). Dok u drugom slucaju on je 1, i sabira se sa samim sobom inkrementiranim za jedan, tj. sa 2, pa daje 3 kao rezultat.

Opet, idiotski primer (isforsiran), koji sluzi samo da objasni kako kod ne treba da izgleda. Tj. sta da se izbegne, ako se zeli jasan i pravilno napisan kode. Kao i da prikaze razliku izmedju left i right evaluacije izraza.

Obicno se ta evaluacija koristi, kad se zeli ubrzati/napraviti cistiji kode, da se ne pishe pedeset if-ova...


if (mojPointer != null && mojPointer->nekaVrednost < zeljenaVrednost)
{
obavestiMamuDaJeSkuvanaSarma();
}

U tom slucaju left first chekira da li je uopste pointer setovan... pa tek onda u ostatku izraza trazi promenjivu iz njega, ako jeste. Ako nije odma preskace ceo blok. Ali opet, treba znati specificnosti jezika i kompajlera ako se pise takav code. Sigurnije je pisati dva odvojena if-a.





[Ovu poruku je menjao Cube25 dana 19.01.2018. u 13:07 GMT+1]
 
Odgovor na temu

Everback

Član broj: 337738
*.dynamic.isp.telekom.rs.



+34 Profil

icon Re: Kod koji daje neočekivani rezultat19.01.2018. u 12:05 - pre 75 meseci
Ljudi očekuju rezultat, tako da kod ne može da daje uvek očekivani rezultat. Kod nema pojma šta ljudi očekuju. Očekivanja su često nerealna :) Uglavnom, ovo je tema o tome, a ne o dobrom kodu.

P.S.

Ne kaže se idiotski nego idiJotski.

P.P.S.

Samo se zezam, idiotski je ispravno, nije ispravno iZforsiran.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
c-bg-d-p3-92.bvcom.net.



+1064 Profil

icon Re: Kod koji daje neočekivani rezultat19.01.2018. u 14:41 - pre 75 meseci
Citat:
Everback:
Ne postoji sintaksna greška. Kod je ispravan. Kod php-a se i ne preporučuje pisanje zatvarajućeg taga ukoliko nije neophodno, jer se može desiti da zbog nekog spejsa iza zatvarajućeg taga nenamerno pošaljemo sadržaj pre hedera...

Rezultat ovog programa je celi broj. Promenljiva x ima inicijalnu vrednost 1. Operator ++ uvećava promenljivu za jedan. Plus sabira vrednosti. Rezultat je _____

P.S.
Napisao sam maločas da bi trebalo da je isti rezultat i kod ostalih jezika iz C familije, pa rekoh da testiram C i JS i rezultat se razlikuje :) C i PHP daju isti rezultat.


Ne znam za PHP, ali u C-u ti je to undefined behavior. Dvaput menjanje vrednosti varijable bez intervenieng sequence poijnt ;)
eidt:
Zapravo nisam siguran posto samo printas, najverovatnije je ok ;)
 
Odgovor na temu

Bojan Basic
Novi Sad

SuperModerator
Član broj: 6578
Poruke: 3996
87.116.178.*

Jabber: bojan_basic@elitesecurity.org
ICQ: 305820253


+605 Profil

icon Re: Kod koji daje neočekivani rezultat19.01.2018. u 14:54 - pre 75 meseci
Citat:
Everback:
Da, zato je prethodno rešenje 4.

Zapravo, nije izvesno da će rezultat biti 4. Svakako ++ ima prednost nad +, što znači da će svakako sabiranje biti izvršeno nakon ++, ali pitanje je koje dve vrednosti će biti sabrane, tj. da li će vrednost levog $x biti uzeta u obzir pre ili posle primene ++ (što nije ni u kakvoj vezi s prioritetom ++ u odnosu na +). Pogledaj ovde:
Citat:
Operator precedence and associativity only determine how expressions are grouped, they do not specify an order of evaluation. PHP does not (in the general case) specify in which order an expression is evaluated and code that assumes a specific order of evaluation should be avoided, because the behavior can change between versions of PHP or depending on the surrounding code.

Ljubičice crvena, što si plava kô zelena trava.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
c-bg-d-p3-92.bvcom.net.



+1064 Profil

icon Re: Kod koji daje neočekivani rezultat19.01.2018. u 15:05 - pre 75 meseci
Code:

interv.c: In function ‘main’:
interv.c:5:23: warning: operation on ‘x’ may be undefined [-Wsequence-point]
     printf("%d\n",x + ++x);


Zapravo jeste undefined behavior kako sam pretpostavio ;p
 
Odgovor na temu

Everbeck

Član broj: 337767
Poruke: 2
*.dynamic.isp.telekom.rs.



+31 Profil

icon Re: Kod koji daje neočekivani rezultat19.01.2018. u 15:23 - pre 75 meseci
@Bojan
Ok, onda ovo jeste definitivno kod koji proizvodi neočekivani rezultat, a sada je jasno i zašto JS daje vrednost 3.

@Branimir Maksimovic
Kod mene je prošlo kompajliranje i rezultat je 4. Kompajler je gcc (Ubuntu 5.4.0-6ubuntu1~16.04.5) 5.4.0 20160609. Sigurno je da i kod C-a rezultat zavisi od implementacije kompajlera. Čini mi se da je u poslednjim verzijama c++ standarda to definisano.

Kada sam već tu, čudni kod nešto iznad je Intercall i prikazan je najjednostavniji način kako da se u ovom programskom jeziku ispiše na konzoli Hello word. Naravno ja ne znam Intercall.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
c-bg-d-p3-92.bvcom.net.



+1064 Profil

icon Re: Kod koji daje neočekivani rezultat19.01.2018. u 15:40 - pre 75 meseci
Undefined behavior je greska u run-time ;)
Ja sam kompajlirao sa gcc-trunk i to je najsveziji moguci koji ti cak daje warninge i o nedefinisanom ponasanju ;p
 
Odgovor na temu

mjanjic
Šikagou

Član broj: 187539
Poruke: 2679



+690 Profil

icon Re: Kod koji daje neočekivani rezultat19.01.2018. u 20:21 - pre 75 meseci
Citat:
Code:

<?php 
    $x=1; 
    echo $x + ++$x;




Code:
Finding entry points
Branch analysis from position: 0
Jump found. (Code = 62) Position 1 = -2
filename:       /in/OIeIG
function name:  (null)
number of ops:  6
compiled vars:  !0 = $x
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   3     0  E >   ASSIGN                                                   !0, 1
   4     1        PRE_INC                                          $2      !0
         2        ADD                                              ~3      !0, $2
         3        CONCAT                                           ~4      ~3, '%0A'
         4        ECHO                                                     ~4
         5      > RETURN                                                   1

Generated using Vulcan Logic Dumper, using php 7.1.0


Očigledno, kao što su neki rekli, inkrementiranje ima prioritet.
Blessed are those who can laugh at themselves, for they shall never cease to be amused.
 
Odgovor na temu

mjanjic
Šikagou

Član broj: 187539
Poruke: 2679



+690 Profil

icon Re: Kod koji daje neočekivani rezultat19.01.2018. u 20:22 - pre 75 meseci
Međutim, interesantno je da sledeći kod radi normalno:
Code:
<?php 
    $x=1; 
    echo $x+++$x;

Blessed are those who can laugh at themselves, for they shall never cease to be amused.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
c-bg-d-p3-92.bvcom.net.



+1064 Profil

icon Re: Kod koji daje neočekivani rezultat19.01.2018. u 20:37 - pre 75 meseci
Kako parsuje +++ ?
 
Odgovor na temu

Everbeck

Član broj: 337767
Poruke: 2
*.dynamic.isp.telekom.rs.



+31 Profil

icon Re: Kod koji daje neočekivani rezultat19.01.2018. u 21:11 - pre 75 meseci
Verovatno kao $x++ +$x
 
Odgovor na temu

damirh
Damir Hadnadjev
Oxfordshire

Član broj: 104515
Poruke: 143
*.dynamic.dsl.as9105.com.



+17 Profil

icon Re: Kod koji daje neočekivani rezultat19.01.2018. u 23:25 - pre 75 meseci
meni je zanimljivije da eclipse dozvoljava
Code:
int x=1; 
System.out.println(x+++x);

gde ne zna da li hocu x++ ili ++x
a ne dozvoljava
Code:
int x=1; 
System.out.println(1+++x);

gde bi mu bilo jasno da sigurno ne mislim 1++ dok je 1+ ++x sasvim legitimno

a x++ +x kao i x+ ++x daju rezultat 3
 
Odgovor na temu

[es] :: Art of Programming :: Kod koji daje neočekivani rezultat

Strane: 1 2 3 4 5 ... Dalje > >>

[ Pregleda: 107571 | Odgovora: 337 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.