Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 337 odgovora
  • 168.522 pregleda

Najnovija ↓

Kod koji daje neočekivani rezultat 19.01.2018. u 09:59 · pre 106 meseci #1
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;

Re: Kod koji daje neočekivani rezultat 19.01.2018. u 11:56 · pre 106 meseci #3
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.
Re: Kod koji daje neočekivani rezultat 19.01.2018. u 12:03 · pre 106 meseci #4
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.
Re: Kod koji daje neočekivani rezultat 19.01.2018. u 12:41 · pre 106 meseci #8
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
Re: Kod koji daje neočekivani rezultat 19.01.2018. u 12:56 · pre 106 meseci
izmenjeno 1 put, poslednji put Cube25 19.01.2018. u 13:07
  1. Cube2519.01.2018. u 13:07zapis iz teksta poruke
#9
@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.
Re: Kod koji daje neočekivani rezultat 19.01.2018. u 13:05 · pre 106 meseci #10
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.
Re: Kod koji daje neočekivani rezultat 19.01.2018. u 15:41 · pre 106 meseci #11
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 ;)
Re: Kod koji daje neočekivani rezultat 19.01.2018. u 15:54 · pre 106 meseci #12
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.
Potpis
Ljubičice crvena, što si plava kô zelena trava.
Re: Kod koji daje neočekivani rezultat 19.01.2018. u 16:05 · pre 106 meseci #13
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
Re: Kod koji daje neočekivani rezultat 19.01.2018. u 16:23 · pre 106 meseci #14
@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.
Re: Kod koji daje neočekivani rezultat 19.01.2018. u 16:40 · pre 106 meseci #15
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
Re: Kod koji daje neočekivani rezultat 19.01.2018. u 21:21 · pre 106 meseci #16
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.
Potpis
Blessed are those who can laugh at themselves, for they shall never cease to be amused.
Re: Kod koji daje neočekivani rezultat 19.01.2018. u 21:22 · pre 106 meseci #17
Međutim, interesantno je da sledeći kod radi normalno:
Code:
<?php 
    $x=1; 
    echo $x+++$x;
Potpis
Blessed are those who can laugh at themselves, for they shall never cease to be amused.
Re: Kod koji daje neočekivani rezultat 20.01.2018. u 00:25 · pre 106 meseci #20
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
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme