• 26 odgovora
  • 11.119 pregleda
interesantna ideja (kako kome ) mada verovatno nema resenja 02.02.2005. u 18:07 · pre 264 meseci #1


moze li se u c-u zameniti vrednost dve varijable bez uvodjenja trece


dakle da se uradi sledece samo bez temp varijable

int a
int b
int temp

main()
{
a = 6;
b = 7;

printf("Vrednost a je %d ",a);
printf("Vrednost b je %d ",b);
temp = b;
b = a;
a = temp;
printf("Vrednost posle zamene a je %d ",a);
printf("Vrednost posle zamene b je %d ",b);
}



izvinjavam se ako ima gresaka u kodu nenaviknut sam na tastaturu koju trenutno kotristim pa mi se mozda omakla neka a mrzi me da isravljam

ovo mitanje me cisto zanima ima li nacina ne treba mi neto posebno

iako ja licno sumnjam da ima
Re: interesantna ideja (kako kome ) mada verovatno nema resenja 02.02.2005. u 18:19 · pre 264 meseci #3
a = a ^ b
b = a ^ b [ = a ^ b ^ b = a ]
a = a ^ b [ = a ^ a ^ b = b ]

ili ljepše u asembleru:

xor eax, ebx
xor ebx, eax
xor eax, ebx

Mislim da ima verzija i sa + i - :>

[Ovu poruku je menjao Sundance dana 02.02.2005. u 19:20 GMT+1]
Re: interesantna ideja (kako kome ) mada verovatno nema resenja 02.02.2005. u 18:20 · pre 264 meseci #4


to mi palo na pamet dok sam putovao busom u novi sad (4 sata traje voznja)
i dok sam razmisljao i obnavljano upravljanje memorijom u c-u

pa se moj stedljivi duh setio kako jos jedna varijabla zauzima vise prostora :))))))
Re: interesantna ideja (kako kome ) mada verovatno nema resenja 03.02.2005. u 07:56 · pre 264 meseci #10
[quote]yooyo:
Code:
a ^= b ^= a ^= b;


Ovo nije ispravan C, tj. izaziva undefined behaviour. U istom izrazu vise puta mijenjas vrijednost varijable bez sequence pointa izmedju.

Ukratko: razni kompajleri mogu generirati razliciti kod koji nece napraviti ono sto bi trebao. Ispravno je sa 3 odvojene naredbe.
Re: interesantna ideja (kako kome ) mada verovatno nema resenja 03.02.2005. u 14:05 · pre 264 meseci #12
Mislim da je xor ipak najispravniji, jer kod ostalih rešenja može doći do prekoračenja. (mada onom sabiranju i oduzimanju to ne bi trebalo da smeta)
U svakom slučaju xor je najbrži od svih ponuđenih ;)
Potpis
ex. trooper
Oh goody... it's my Illudium PU-36 Explosive Space Modulator!
Softversko Inženjerstvo
♪♫♪
Re: interesantna ideja (kako kome ) mada verovatno nema resenja 03.02.2005. u 14:11 · pre 264 meseci #14
Citat:
ZVRBA: Ovo nije ispravan C, tj. izaziva undefined behaviour. U istom izrazu vise puta mijenjas vrijednost varijable bez sequence pointa izmedju.

Ukratko: razni kompajleri mogu generirati razliciti kod koji nece napraviti ono sto bi trebao. Ispravno je sa 3 odvojene naredbe.

zvrba, svaki C kompajler koji postuje standard bi trebalo bez problema to da kompajlira...
Potpis
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
Re: interesantna ideja (kako kome ) mada verovatno nema resenja 03.02.2005. u 14:38 · pre 264 meseci #15
Citat:
zvrba:

Ovo nije ispravan C, tj. izaziva undefined behaviour. U istom izrazu vise puta mijenjas vrijednost varijable bez sequence pointa izmedju.

Ukratko: razni kompajleri mogu generirati razliciti kod koji nece napraviti ono sto bi trebao. Ispravno je sa 3 odvojene naredbe.


Cudno... meni je ovo radilo i pod Turbo C-om...

Inace... probao sam gornji primer u MSVC 7.1 i evo rezultata:
Code:

void main (void)
{
 int a = 10, b = 20;
 printf("\n%d %d", a, b);
 a ^= b ^= a ^= b;
 printf("\n%d %d", a, b);
}

ASM izlaz izgleda ovako:

push 20
push 10
call printf

push 10
push 20
call printf



Kompajler je provalio da je u pitanju zamena vrednosti 2 broja i potpuno je izbacio code koji to radi!!!

yooyo
Re: interesantna ideja (kako kome ) mada verovatno nema resenja 17.06.2005. u 03:43 · pre 259 meseci #17
Naletjeh sl. na temu: http://www.elitesecurity.org/tema/36766/0 pa se sjetih ove :)

U biti je zvrba u pravu, gcc sa opcijom -Wsequence-point (odnosno -Wall) na gornji yooyo-ov program daje upozorenje:

Citat:
warning: operation on `a' may be undefined


dok MS VC++ 8.0b2 ne daje upozorenje čak ni sa /W4 :/

Premda oba daju točan (isti) output...

Ali kako netko reče...likove koji pišu ovakav kod bi trebalo bacit kroz prozor :)
Re: interesantna ideja (kako kome ) mada verovatno nema resenja 17.06.2005. u 17:51 · pre 259 meseci #18
Hehehe... vidim da nitko nije mislio na overflow? Cast rjesenjima sa XOR-om, no pokusajte to sa vrijednostima poput 32000 i 32001, a nek se zamjenjuju podaci tipa integer :) Nije valjda da ne radi??? E pa stvarno...
Re: interesantna ideja (kako kome ) mada verovatno nema resenja 21.06.2005. u 07:48 · pre 259 meseci #20
Citat:
Sundance: Rješenje preko XOR-a je jedino od svih type-agnostic.


Nije. ne radi sa floating-pointom. osim ako ne koristis ruzne castove.

Sto se tice +/- nad FP varijablama, rezultat "zamjene" ne mora biti identican pocetnim brojevima radi zaokruzivanja u FP aritmetici.

Sve skupa, IMO, ovo je zanimljiva matematicka mozgalica sa NULA primjene u praksi.

Bezveze narusava citljivost programa, a nije ni efikasno koliko bi moglo biti imajuci u vidu da mnogi procesori imaju instrukcije tipa XCHG koje atomicki zamjenjuju sadrzaj registra sa drugim registrom ili memorijskom lokacijom (ili cak ponekad memorija <-> memorija).
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme