» »

[C] bitni operator

[C] bitni operator

1
2
3

Gundolf ::

Če v C rečemo if (a=1) .... potem nam kar priredi a-ju 1. Zato moramo reči if (a==1), da je ta if nedestruktiven za a.
Zakaj ne bi potem s to logiko šli tudi iz & na &&?

Zato sem te vprašal po tej ideji, ker je edino na kar sem lahko sklepal iz zgornjega tisto kar sem napisal (& postane destruktiven se pravi identičen &=). Kar se pa Criticalla tiče pa ok, ni se treba branit zakaj si kaj uporabil in zakaj ne. Upam da neuporaba && ni edina poenostavitev C-ja, v Criticallu. Je še nekaj konstruktov, ki so zelo primerni za poenostavitev dela človeškemu programerju in so najverjetneje v Criticallu povsem nepotrebni.

Bolj me zanima kako ti, ko kdaj sam kakšen program napišeš v C(++) (če ga sploh), pišeš logične in in ali. Ker očitno se vgrajenih logičnih operatorjev izogibaš.

Thomas ::

Ne, ne. To kako in kaj delam, o tem ne govorim. :)
Man muss immer generalisieren - Carl Jacobi

SasoS ::

Kako bi ti spisal:

a = fx1();
b = fx2();

if(a && b)
printf("Obe funkciji sta uspeli\n");
else
printf("Fail");

??

OwcA ::

Načeloma gre tudi z &. Največja pomankljivost slednjega je, da s preverjanjem ne neha, čim lahko.
Otroška radovednost - gonilo napredka.

snow ::


Kako bi ti spisal:

a = fx1();
b = fx2();

if(a && b)
printf("Obe funkciji sta uspeli\n");
else
printf("Fail");


V critticall omejenem c bi blo takole:
true=0;
if(a)
{
    if(b)
    {
        true=1;
    }
}

if(true)
{
    printf("obe uspeli");
}
else
{
    printf("fail");
}


Me zanima če Thomas misli isto.
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Thomas ::

Thomas misli v bistvu kot je rekel snow.

Gnezden if, namesto &&.

Manj verjeten pogoj je prvi.
Man muss immer generalisieren - Carl Jacobi

SasoS ::

se pravi eno preverjanje in ena spremenljivka več zato ker ne maraš &&? :D

Thomas ::

To si pa čisto narobe izračunal.
Man muss immer generalisieren - Carl Jacobi

Brane2 ::

Kako v bistvu veste, kaj bo compiler iz tega naredil in kako bo pokrajšal zadevo ?

Ali compilate brez optimizacij ?
On the journey of life, I chose the psycho path.

SasoS ::

hmm...zanimivo...gcc bo na -O2 naredil isto kodo v obeh primerih. Vseeno se mi zdi z && bolj readable :D

Thomas ::

Compiler ne ve, kateri pogoj je manj verjeten. Lazy eavaluation switch na on, mu pač omogoči zapuščanje pogoja takoj ko je false, pri &&.

Isto je pa doseženo z dvojno (mnogoterno) if zanko.

Samo ... hehe .. to je tko mau. Amatersko. Taprav program mora on fly zamenjat vrstni red ifov, če pri prvem gnezdenem, relativno malokrat pade ven.

Mah .. to je tko. Manufaktura je pri programiranju na poti v muzej.
Man muss immer generalisieren - Carl Jacobi

Thomas ::

> Vseeno se mi zdi z && bolj readable

To je dost grše od goto-ja. Ki je b.p.
Man muss immer generalisieren - Carl Jacobi

Brane2 ::


Compiler ne ve, kateri pogoj je manj verjeten.


Ne nujno. Ti pri gccju lahko vklopiš poseben profiling, scompilaš zadevo, jo poženeš v nekem tipičnem okolju, stvar prešteje kako so se izšli določeni skoki in temu ustrezno nastavi končno verzijo.
On the journey of life, I chose the psycho path.

Thomas ::

Ni dovolj!

Verjetnosti nista neodvisni. Bayesova analiza je potrebna za pravilno postavitev zank. Ali nekaj ekvivalentnega.

Recimo, to da prvi if zavrne 90%, drugi pa potem 99% primerov ... NE POMENI, da moraš nujno dat drugega na prvo mesto. Ker drugi ne dela na celi populaciji, tako kot prvi.

But there is more ...
Man muss immer generalisieren - Carl Jacobi

Brane2 ::

Pojma nimam kako to dela gcc.

Vsakakor ima na vpogled source, vse funkcije in temu ustrezne števce.

Ni nujno, da se gre samo (niti ne tako) trapasto štetje, kot to počnejo recimo nekateri CPUji v zgodovini skokov...
On the journey of life, I chose the psycho path.

Thomas ::

Tako pravilo je:

Dokler niso vsi skoki nepredvidljivi, program ni dobro napisan.
Man muss immer generalisieren - Carl Jacobi

Brane2 ::

Mogoče še nekaj. AFAIK ima gcc/gdb precej elpo urejen profiling, skozi katerega lahko ve natanko koliko ciklov je program preživel v neki funkciji.

Če stvar naredi spremembo in zato pospeši notranjo funkcijo vendar je zato vse skupaj počasnejše, lahko to lepo vidi iz stanja števcev.
Tudi ni nujno,d a števci kažejo srednji ali kumulativni čas, mislim, da lahko izmeriš čas natanko določenega preleta funkcije.

Spomnim se, da je bila stvar videti kar kompleksna in je omogočala zajem shitloada koristnih podatkov.

Druga stvar pa je seveda, če ti že sam profiling spremeni stvari tako, da se program ne obnaša tako kot bi se sicer.

A tudi temu se verjetno da lepo pomagat, če se zavedaš omejitev orodja...
On the journey of life, I chose the psycho path.

Brane2 ::


Dokler niso vsi skoki nepredvidljivi, program ni dobro napisan.


Ne razumem točno, na kaj misliš.

V determinističnem stroju so vsi skoki predvidljivi.
Daj mi dato, program in zadosti časa in povem ti, ali bo zadeva skočila ali ne.

Očitno torej misliš na nekaj drugega s predvidljivostjo.

Če nimaš vse date (ampak mogoče samo kaka povprečja) potem o manjkajočih podatkih lahko samo ugibaš.

ALi hočeš reči, da je optimum, če se skače 50% časa, povprečeno skozi zelo dolgo obdobje ?
On the journey of life, I chose the psycho path.

Thomas ::

> V determinističnem stroju so vsi skoki predvidljivi.

Le z dosti computinga. Natanko toliko, kolikor ga program sam po sebi ponuca.

Delajo pa seveda enostavnejše predictinge skokov. Če so kakorkoli statistično signifikantno uspešni, program ni optimalen.

Ja. If mora biti tak, da se izvaja, kot bi metal pošten kovanec. Nobenih pravil ne sme biti v tem. Sicer je program s tem ifom suboptimalen.
Man muss immer generalisieren - Carl Jacobi

Brane2 ::

IMHO to najbrž velja za von Neumannov stroj, kjer je vsak dostop veljal eno enoto časa.

Samo ta tip ni delal za Intel :D.

Tu pa je odvisno marsikaj od velikosti zanke, alignmenta v RAMu, stanja cachea, hitrosti RAM-a, hitrosti corea itd itd.

A taka zasnova CPUja in komplikacija pravil vsaj nekaj ne spremeni-a tega pravila ?
On the journey of life, I chose the psycho path.

Thomas ::

> A taka zasnova CPUja in komplikacija pravil vsaj nekaj ne spremeni-a tega pravila ?

Ga spremeni. Potem mora if v obeh primerih (da je true in da je false) pokuriti enako časa. Potem je optimiziran na čas.

Lahko je pa optimiziran tudi na energijo. Da po obeh možnih plateh v povprečju pokuri enako energije.

Pa seveda, da ni kakšnih enostavnih vzorcev v obeh primerih. Da bi kakšen predicting bil tako pameten, da bi uspešno predvideval program, kam se bo nagnil.

Če je ... ni idealen.
Man muss immer generalisieren - Carl Jacobi

64202 ::

> > Vseeno se mi zdi z && bolj readable
> To je dost grše od goto-ja. Ki je b.p.

Sem ze v praksi videl tako kodo (resda v stari juniks kodi :)):

pogoj && klic();

namesto

if(pogoj) klic();
I am NaN, I am a free man!

SasoS ::

if (pogoj && !klic()) printf("Error"); :D

NavadniNimda ::

SasoS, bravo.:D Recimo da je klic () funkcija, katere vrnitveni tip je void. Potem se Error izpiše povsem randomly, saj se vrnitvena vrednost (skalarnih funkcij) ponavadi nahaja v AX (EAX) registru.:)) >:D

64202 ::

> if (pogoj && !klic()) printf("Error"); :D

Mislis:
pogoj && (klic() || printf("Error"));
>:D
I am NaN, I am a free man!

Gundolf ::

Ce klic vrne void potem se ti compiler pritozi ob taki kodi, ne pa da ti nekaj random dela.
pogoj && (klic() || printf("Error"));
Shit! Men pa tole dobr zgleda.

NavadniNimda ::

Sej ga lahko nategneš s typecastom...:D

pogoj && (klic() || *(int *) (printf("Error") != 0)); // :))

Zgodovina sprememb…

BigWhale ::

Ali ne bi bilo lepse uporabiti ? ;)

64202 ::

Torej:
int shrani_v_bazo(int);
int izpisi_napako(int);

int neki(int a)
{
  int napaka;
  return
    a > 5
      ? (napaka = shrani_v_bazo(a * 3))
      : (napaka = shrani_v_bazo(0)),
    napaka == 0 || izpisi_napako(napaka),
    napaka;
}

>:D
I am NaN, I am a free man!

Zgodovina sprememb…

  • spremenilo: 64202 ()

Gundolf ::

NavadniNimda, ne bom trdil, sem pa 99% prepričan da ne moreš void castat v noben tip.

NavadniNimda ::

Ne, sej to sem mislu v kakšnem starejšem C-ju, brez skrbi, da se je dalo!
C++ je potem (hvalabogu) v zadnjih 10 letih kar precejšnjo pot naredil...8-)

Evo, še ena C-jevska cvetka - ZAKAJ SE VEDNO IZPIŠE "JAO!"?
(To napako sem že pred leti debuggeriral ene 8 ur! :8) )

if (a += 10); printf ("Jao!\n);
// izpisati "Jao" samo kadar (a != 0)

Zgodovina sprememb…

BigWhale ::

Em, ne samo da voida ne mores castat v nekaj, itak ne mores returnat nic pametnega. ;)

Nimda:
if (a += 10); printf ("Jao!\n);

tole se ne bi izpisalo, ce bi bil pred tem a -10...

:P

Gundolf ::

NavadniNimda, tale smajli vse pove - ;)

BigWhale ::

Pa en narekovaj tam manjka...

BigWhale ::

aja... pa ; je prevec
:P

NavadniNimda ::

BigWhale - sej ne castam voida, ampak funkcijsko vrednost v izrazu. V plain C-ju se je seveda to lahko naredilo brez posledic. Odnosno, če sem bolj precizen, S POSLEDICAMI.:D

Un izraz, ki sem ga dal (printf JAO) seveda nima veze s pogojem IF-a, ampak s tem, da if stavku sledi podpičje, kot je nakazal Gundolf. Gre za legalen izraz, vem pa da sem enkrat pred leti imel tak problem. Rabil sem cel dan, da sem odkril napako, v tem cajtu pa so se zbrali sosedje pred blokom in zagrozili z demonstracijami. To pa zato, ker sem tolk tulu od jeze!:8)

"C", kot pravijo, "is not for the faint of heart!":))

Sergio ::

Haha, jaz sm pa to takoj vidu. Zato ker sem enkrat bral pejdz o najbolj bolecih programerjevih napakah. Pa sem si tega se posebej zapomnil :D
Tako grem jaz, tako gre vsak, kdor čuti cilj v daljavi:
če usoda ustavi mu korak,
on se ji zoperstavi.

popec ::

Mene pa zanima, ali res lahko izklopim short circuit (lazy) evaluacijo logičnih izrazov. Dosedaj sem bil prepričan, da je to feature od jezika. Vem, da se je to dalo narediti v turbo pascalu, za c/c++ pa še nisem videl te opcije.
h$^

OwcA ::

Stranski učinki so že sami po sebi grdi, ne vem čemu bi si želel temu dodati še nedeterministične skrivalnice.
Otroška radovednost - gonilo napredka.

Gundolf ::

Ne moreš izklopit short-circuitanja logičnih izrazov. Tako delovanje je na srečo definirano v standardu. Bi ti precej knjižnic crknilo grozne smrti, če bi to lahko naredil. Tudi sicer ni nobenega dobrega razloga, da bi kaj takega storil.

Thomas ::

Komot izklopiš lazy evaluation. Ni problema.
Man muss immer generalisieren - Carl Jacobi

popec ::

Aha. Recimo, da verjamem in bi rad zadevo preizkusil.

Ob bežnem pregledu opcij Visual C++-a in gcc-ja nisem nikjer zasledil kakšne na to temo. Ali jih morda kdo pozna?
h$^

Fury ::

popec sam da ne bos na EEju isklopu k bo slo vse v kurac :)

Gundolf ::

Lejga popec, v nobenem kulturnem C/C++ prevajalniku ni takega switcha, ki bi izklopil short-circuiting logičnih operatorjev. Kaj ti še vedno ni jasno, da bi tak (vklopljen) switch pokvaril zelo velik delež vse do danes napisane C/C++ kode? Kjer želiš da se ti vedno izvrši tudi desni del logične funkcije ga pač izračunaš v naprej ali pa uporabiš (v primeru C++) bool spremenljivke in bitwise operator (& ali |).

NavadniNimda ::

Jaz sem tudi mnenja, da je short circuit boolean evaluation izrazov ena bolj simpatičnih pridobitev civilizacije. Na ta račun dobimo VSAJ dve reči:
- hitrejše izvajanje kode!8-)
- prisili se programerja, da ne dela funkcij z bebavimi stranskimi efekti.>:D

Evo, to je bilo moje OSEBNO, subjektivno mnenje!:))

Zgodovina sprememb…

popec ::

Fantje, saj jaz se popolnoma strinjam z uporabo short circuit evaluiranih operatorjev. :) Tudi sam jih uporabljam še in še vsak dan, vsakih deset vrstic.

Hotel sem le primorati Thomasa, naj preveri svoje trditve, zato sem se pretvarjal, da jim verjamem. (Preberi na primer še enkrat moj post.)
h$^

Thomas ::

Katera moja trditev ti ni všeč?

Zavračanje &&?
Man muss immer generalisieren - Carl Jacobi

popec ::

Thomas je rekel:
> Komot izklopiš lazy evaluation. Ni problema.

kot odgovor na Gundolf-ovo izjavo:
> Ne moreš izklopit short-circuitanja logičnih izrazov.

Zanimalo me je torej, če poznaš kakšno konkretno command-line opcijo za to reč ali ne.
h$^

Thomas ::

> Komot izklopiš lazy evaluation. Ni problema.

Namesto if (a && b) ....

c=a && b; if (c!=0)

Tkole.
Man muss immer generalisieren - Carl Jacobi

popec ::

Ah-ha! ;) ;) ;)

c=a && b; if (c!=0)

Če se a evaluira (ovrednoti) kot false (neresnično), se b ne bo ovrednotil (evaluiral), dasiravno si potem vrednost nedeklarirane (neopredeljene) spremenljivke (variable) c primerjal (kompariral) z ničlo (0) v stavku (sestavljenem izrazu) if (če). Kako si potemtakem (posledično) izklopil (preprečil/supresiral) "short circuit" (kratkostično) evaluacijo (ovrednotenje)?

Saj vem, zdaj bos rekel, da si govoril samo o izrazih znotraj if (če) stavkov. Predlagam tri ure športnega udejstvovanja na teden pri kakšnem posebej zateženem coachu (trenerju ali predavatelju športne vzgoje).

Skratka, lol in rotfl.
h$^
1
2
3


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

križci krožci c # (strani: 1 2 )

Oddelek: Programiranje
5011788 (10447) Yacked2
»

[Java] While zanka

Oddelek: Programiranje
262343 (1926) kunigunda
»

Nemorem rešit ene naloge z c++ (sem začetnik) (strani: 1 2 )

Oddelek: Programiranje
6810354 (6092) technolog
»

[c] Enaki datoteki

Oddelek: Programiranje
71026 (886) Spura
»

[C#] overloaded operator ==

Oddelek: Programiranje
91105 (984) user4683

Več podobnih tem