Avatar billede funtex Nybegynder
11. juni 2006 - 13:08 Der er 10 kommentarer og
1 løsning

rækkefølge af udtryk med brug af &&operatoren

Hej,

Jeg er lidt i tvivl om hvorledes && operatoren anvendes i C#
Kan man være sikker på at første udtryk i en if sæting altid evalures først?

F.eks.

if(i > 0 && 100/i == 20)
{

}

Vil ovennævte kode altid gå godt?

På forhånd tak!

//Funtex
Avatar billede nielle Nybegynder
11. juni 2006 - 13:12 #1
Udtrykket evalueres altid fra venstre til højre - med mindre at der bruges paranteser til at ændre rækkefølgen.

Hvis i>0 leddet *ikke* er sandt, så blver det næste led slet ikke forsøgt udregnet.
Avatar billede funtex Nybegynder
11. juni 2006 - 13:18 #2
og det er ALTID fra venstre mod højre?

Så vidt jeg husker(er ikke helt sikker) kræver gcc compileren at alle udtryk er lovlige, fordi den, hvis optimering er slået til, kan finde på at bytte om på rækkefølgen, således at
udtrykket evaluers som

if(100/i == 20 && i > 0)

//Funtex
Avatar billede nielle Nybegynder
11. juni 2006 - 13:21 #3
Hvorvidt det går godt i den forstand at det "giver dig det ønskede resultat", er imidlertid usikkert.

Det afhænger f.eks. ag om i er en integer eller en float. Hvis i er en integervariabel så vil 100/i nemlig være en heltalsdivision. Dette har f.eks. den konsekvens at.

i = 13 => 100/i = 7
i = 42 => 100/i = 2
i = 50 => 100/i = 2
i = 1000 => 100/i = 0

(alt lig med eller over 101 vil resulterer i 0).
Avatar billede nielle Nybegynder
11. juni 2006 - 13:26 #4
Fra Microsoft selv:

http://msdn2.microsoft.com/en-US/library/2a723cdk.aspx

"
The operation

x && y

corresponds to the operation

x & y

except that if x is false, y is not evaluated (because the result of the AND operation is false no matter what the value of y may be). This is known as "short-circuit" evaluation.
"
Avatar billede funtex Nybegynder
11. juni 2006 - 13:27 #5
det er klart.
spørgsmålet handler udelukkende om rækkefølgen.
Det konkrete  kode jeg mistænker for fejl ser ca sådan ud:

try
{
  if(myObj != null && myObj.myFunc() == true)
  {

  }
}
catch(Exception e)
{
}
Jeg har en mistanke om at fejlen skyldes kald af myFunc() selvom byObj == null.
Men hvis rækkefølgen ALTID er fra venstre mod højre, uanset optimering kan det jo ikke forklar fejlen.

//Funtex
Avatar billede nielle Nybegynder
11. juni 2006 - 13:32 #6
Den if-sætning ser sund nok ud, men hvis du vil være elet 101% sikker på at det ikke er det fejlen skydles, kan du jo bryde den op i det ækvivalente udtryk:

try
{
    if (myObj != null)
    {
        if (myObj.myFunc() == true)
        {
        }
    }
}
catch(Exception e)
{
}

(jeg forudsiger dog at du får den sammen fejl ;^))
Avatar billede funtex Nybegynder
11. juni 2006 - 13:50 #7
Ja det er naturligvis muligt at dele den op.
Fejlen er aperiodisk og bla derfor svær at reproducere. Derfor vil jeg nødigt ændre i koden før jeg er rimelig sikker på hvor fejlen ligger.
Jeg har kigget lidt i specifikationen for C# men jeg synes ikke det fremgår helt klart om række følgen altid er fra venstre mod højre under evalueringen.

MSDNs beskrivelse, som du også linker til tyder dog på at det altid er samme evaluerings rækkefølge

//Funtex
Avatar billede driis Nybegynder
11. juni 2006 - 14:14 #8
Jeg synes at nielle's link til MSDN klart siger, at der altid evalueres fra venstre mod højre. Det understøttes af C# specifikationen, der bl.a. siger:

•    The operation x && y corresponds to the operation x & y, except that y is evaluated only if x is true.

-- og --

•    The operation x && y is evaluated as x ? y : false. In other words, x is first evaluated and converted to type bool. Then, if x is true, y is evaluated and converted to type bool, and this becomes the result of the operation. Otherwise, the result of the operation is false.

(page 169).
Avatar billede nielle Nybegynder
11. juni 2006 - 15:34 #9
Jeg er nu også helt sikker. Jeg gav kun kode-eksemplet for at du selv kunne konstatere at fejlen alligevel opstod, og at den derfor ikke havde noget at gøre med &&.
Avatar billede funtex Nybegynder
11. juni 2006 - 16:44 #10
Fint

Post et svar og du får points :)

//Funtex
Avatar billede nielle Nybegynder
11. juni 2006 - 17:00 #11
Svar :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester