/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Et spørgsmål om IF
Fra : Stig Nørgaard Jepsen


Dato : 02-08-01 22:01

Hvis man fx. har en if-sætning bestående af:
if ($a == 2 or $k > 0 or (in_array ("test", $array))) { ....

Vil den så teste hele sætningen igennem lige meget hvad,
eller vil den lige så snart den finder noget der er sand hoppe videre.

Mvh Stig





 
 
Jonas Koch Bentzen (02-08-2001)
Kommentar
Fra : Jonas Koch Bentzen


Dato : 02-08-01 22:30

Stig Nørgaard Jepsen wrote:

> Hvis man fx. har en if-sætning bestående af:
> if ($a == 2 or $k > 0 or (in_array ("test", $array))) { ....
>
> Vil den så teste hele sætningen igennem lige meget hvad,
> eller vil den lige så snart den finder noget der er sand hoppe videre.

Det sidste, så vidt jeg ved.

--
Jonas Koch Bentzen

Niels Andersen (02-08-2001)
Kommentar
Fra : Niels Andersen


Dato : 02-08-01 23:14

"Stig Nørgaard Jepsen" <stigen@mail.dk> wrote in message
news:3b69bf0f$0$287$edfadb0f@dspool01.news.tele.dk...
> if ($a == 2 or $k > 0 or (in_array ("test", $array))) { ....
>
> Vil den så teste hele sætningen igennem lige meget hvad,
> eller vil den lige så snart den finder noget der er sand hoppe videre.

($a or $b)
vil evaluere $a og $b. Hvis én af dem kan castes til "sand", er hele
udtrykket sandt.

($a || $b)
vil evaluere $a. Hvis a kan castes til "sand", vil hele udtrykket være
sandt. Hvis ikke, vil $b blive evalueret og afgøre hele udtrykket.

Altså, "or" vil gøre at det hele bliver beregnet, "||" stopper når udfaldet
kan gættes.

Det er tilsvarende med "and" og "&&".


Mvh.

Niels Andersen



Mikkel Christensen (02-08-2001)
Kommentar
Fra : Mikkel Christensen


Dato : 02-08-01 23:31

> Altså, "or" vil gøre at det hele bliver beregnet, "||" stopper når
udfaldet
> kan gættes.
>
> Det er tilsvarende med "and" og "&&".

Det kan da ikke være det samme med "and" og &&.
Der skal det jo tjekkes om begge er sande så den vil under alle
omstændigheder teste hele udtrykket.
At det så måske sker i en anden rækkefælge er en anden sag...



Christian Schmidt (02-08-2001)
Kommentar
Fra : Christian Schmidt


Dato : 02-08-01 23:42

Mikkel Christensen wrote:
>
> > Altså, "or" vil gøre at det hele bliver beregnet, "||" stopper når
> > udfaldet kan gættes.
> >
> > Det er tilsvarende med "and" og "&&".
>
> Det kan da ikke være det samme med "and" og &&.
> Der skal det jo tjekkes om begge er sande så den vil under alle
> omstændigheder teste hele udtrykket.

Jo, det er tilsvarende med "and" - bare omvendt.

Hvis det ene argument er falsk, er det ikke nødvendigt at undersøge det
andet.


Christian

Mikkel Christensen (03-08-2001)
Kommentar
Fra : Mikkel Christensen


Dato : 03-08-01 00:55

> > > Altså, "or" vil gøre at det hele bliver beregnet, "||" stopper når
> > > udfaldet kan gættes.
> > >
> > > Det er tilsvarende med "and" og "&&".
> >
> > Det kan da ikke være det samme med "and" og &&.
> > Der skal det jo tjekkes om begge er sande så den vil under alle
> > omstændigheder teste hele udtrykket.
>
> Jo, det er tilsvarende med "and" - bare omvendt.
>
> Hvis det ene argument er falsk, er det ikke nødvendigt at undersøge det
> andet.

Ja okay, på den måde har du ret.



Christian Schmidt (02-08-2001)
Kommentar
Fra : Christian Schmidt


Dato : 02-08-01 23:41

Niels Andersen wrote:
>
> ($a or $b)
> vil evaluere $a og $b. Hvis én af dem kan castes til "sand", er hele
> udtrykket sandt.
>
> ($a || $b)
> vil evaluere $a. Hvis a kan castes til "sand", vil hele udtrykket være
> sandt. Hvis ikke, vil $b blive evalueret og afgøre hele udtrykket.
>
> Altså, "or" vil gøre at det hele bliver beregnet, "||" stopper når udfaldet
> kan gættes.

Har du et eksempel, der underbygger din påstand? Flg. lille test viser
det modsatte:

   function f() {
    print "f";
    return false;
   }

   function t() {
    print "t";
    return true;
   }
   
   echo t() || f();
   echo ", ";
   echo t() or f();

Udskriver "t1, t1", dvs. det i begge tilfælde kun er første argument,
der evalueres. På
<http://dk.php.net/manual/en/html/language.operators.logical.html>
antydes det, at den eneste forskel mellem "or" og "||" er deres
præcedens.

Det er min erfaring, at venstre operand i et or-udtryk altid evalueres
først, og at videre evaluering stopper, hvis denne er sand - men jeg har
ikke set det nævnt i dokumentationen. Men konstruktionen "do_something()
or die('...')" anvendes flere gange i manualen, så mon ikke det er
tilfældet.

I Java vil venstre operand altid blive evalueret først. Er denne praksis
egentlig almindelig i programmeringssprog?


Sidebemærkning: du benytter ordet "caste" forkert. Caste har at gøre med
en variabels type. Her kigger vi på deres værdi.


Christian

Niels Andersen (03-08-2001)
Kommentar
Fra : Niels Andersen


Dato : 03-08-01 07:31

"Christian Schmidt" <christian@schmidt.net> wrote in message
news:3B69D6F0.54E31D5C@schmidt.net...
> Det er min erfaring, at venstre operand i et or-udtryk altid evalueres
> først, og at videre evaluering stopper, hvis denne er sand - men jeg har
> ikke set det nævnt i dokumentationen.

Jeg kunne heller ikke lige finde noget om det, men vidste jeg havde læst det
et sted.

Jeg har leget med det, og det ser ud til at både or, ||, and og && stoppe
evalueringen når resultatet kan afgøres.
Og nu du siger det har du da ret i, at ellers ville "or die()"-tingen jo
ikke virke.

> I Java vil venstre operand altid blive evalueret først. Er denne praksis
> egentlig almindelig i programmeringssprog?

Ah, det er nok Java der opfører sig som jeg beskrev?
Jeg tror det enten er det, eller det er noget gammelt noget jeg render rundt
og husker på, eller også er det bare mig... :)

Jeg tror i øvrigt det er ganske normalt at man starter fra venstre. Hvorfor
i alverden skulle man gøre andet? :)

> Sidebemærkning: du benytter ordet "caste" forkert. Caste har at gøre med
> en variabels type. Her kigger vi på deres værdi.

Før en variabel kan være sand eller falsk må den castes til en boolean. Det
er her PHP er lidt specielt, synes jeg i hvert fald.

$navn = 'Niels';
if ($navn) {

Her bliver strengen $navn castet til en boolean, og det er da lidt sjovt,
ik'? I fx. Java ville man få en fed fejl, så vidt jeg husker.


Mvh.

Niels Andersen



Thomas L. Kjeldsen (03-08-2001)
Kommentar
Fra : Thomas L. Kjeldsen


Dato : 03-08-01 10:53

In article <syra7.1030$xn.95834@news010.worldonline.dk>, Niels Andersen wrote:
>
> Jeg tror i øvrigt det er ganske normalt at man starter fra venstre. Hvorfor
> i alverden skulle man gøre andet? :)

Det hænger velsagtens sammen med den retning man normalt læser. Så de fleste
programmeringssprog er tilsyneladende lavet i lande hvor man læser fra venstre
til højre.


mvh Thomas

Christian Schmidt (04-08-2001)
Kommentar
Fra : Christian Schmidt


Dato : 04-08-01 13:28

Niels Andersen wrote:
>
> > I Java vil venstre operand altid blive evalueret først. Er denne praksis
> > egentlig almindelig i programmeringssprog?
>
> Ah, det er nok Java der opfører sig som jeg beskrev?
> Jeg tror det enten er det, eller det er noget gammelt noget jeg render rundt
> og husker på, eller også er det bare mig... :)
>
> Jeg tror i øvrigt det er ganske normalt at man starter fra venstre. Hvorfor
> i alverden skulle man gøre andet? :)

Af effektivitetshensyn.

Fx vil det være en god idé at starte med højre operand i udtrykket
(funktion_der_tager_meget_lang_tid_at_afvikle() || $b == 2). Som
programmør vil jeg dog klart foretrække selv at foretage den slags
optimeringer, hvis jeg til gengæld kunne være sikker på, hvilken
rækkefølge udtryk evalueres i.

Jeg mener i forbindelse med mit studium at have hørt om sprog, hvor
rækkefølgen ikke er garanteret. Det kan dog tænkes, at det sprog er af
næsten udelukkende akademisk interesse.


> > Sidebemærkning: du benytter ordet "caste" forkert. Caste har at gøre med
> > en variabels type. Her kigger vi på deres værdi.
>
> Før en variabel kan være sand eller falsk må den castes til en boolean.

Ok, så er vi enige.


> Det er her PHP er lidt specielt, synes jeg i hvert fald.
>
> $navn = 'Niels';
> if ($navn) {
>
> Her bliver strengen $navn castet til en boolean, og det er da lidt sjovt, ik'?

Tjo. I C er det også lidt derhenad. Her har man ikke en særlig type til
boolsk værdier. I stedet opfatter man 0 (og 0.0) som falsk, og alle
andre værdier som sand (sådan husker jeg det i hvert fald - min
C-erfaring ligger nogle år tilbage).


Christian

Mikkel Christensen (04-08-2001)
Kommentar
Fra : Mikkel Christensen


Dato : 04-08-01 16:26


> > Det er her PHP er lidt specielt, synes jeg i hvert fald.
> >
> > $navn = 'Niels';
> > if ($navn) {
> >
> > Her bliver strengen $navn castet til en boolean, og det er da lidt
sjovt, ik'?
>
> Tjo. I C er det også lidt derhenad. Her har man ikke en særlig type til
> boolsk værdier. I stedet opfatter man 0 (og 0.0) som falsk, og alle
> andre værdier som sand (sådan husker jeg det i hvert fald - min
> C-erfaring ligger nogle år tilbage).

Sådan tror jeg også det er i php. Altså at alt andet end nul eller ingenting
er sand.

Prøv at skrive: $var = 0;
if($var) vil så returnere falsk selvom $var ikke er tom.



Niels Andersen (04-08-2001)
Kommentar
Fra : Niels Andersen


Dato : 04-08-01 18:52

"Mikkel Christensen" <barefoot@e-mail.dk> wrote in message
news:9kh461$b1n$1@sunsite.dk...
> > Tjo. I C er det også lidt derhenad. Her har man ikke en særlig type til
> > boolsk værdier. I stedet opfatter man 0 (og 0.0) som falsk, og alle
> > andre værdier som sand (sådan husker jeg det i hvert fald - min
> > C-erfaring ligger nogle år tilbage).
>
> Sådan tror jeg også det er i php. Altså at alt andet end nul eller
ingenting
> er sand.

PHP har boolske værdier. Men når der skal castes til en boolean, så har du
ret.


Mvh.

Niels Andersen



Christian Schmidt (05-08-2001)
Kommentar
Fra : Christian Schmidt


Dato : 05-08-01 12:07

Mikkel Christensen wrote:
>
> > Tjo. I C er det også lidt derhenad. Her har man ikke en særlig type til
> > boolsk værdier. I stedet opfatter man 0 (og 0.0) som falsk, og alle
> > andre værdier som sand (sådan husker jeg det i hvert fald - min
> > C-erfaring ligger nogle år tilbage).
>
> Sådan tror jeg også det er i php. Altså at alt andet end nul eller ingenting
> er sand.
>
> Prøv at skrive: $var = 0;
> if($var) vil så returnere falsk selvom $var ikke er tom.

Yes yes. Min tvivl mht. C skyldes, at jeg ikke ved, hvordan den opfatter
ikke-numeriske værdier (strenge, objekter etc.). Umiddelbart ser det ud
til, at den tomme streng evaluerer til sand.

Men min pointe var nu først og fremmest, at PHP ikke er ene om implicit
at caste en lang række datatyper til boolske værdier, modsat fx Java.


Christian

Jacob Bunk Nielsen (09-08-2001)
Kommentar
Fra : Jacob Bunk Nielsen


Dato : 09-08-01 14:36

Christian Schmidt <christian@schmidt.net> writes:

> Yes yes. Min tvivl mht. C skyldes, at jeg ikke ved, hvordan den opfatter
> ikke-numeriske værdier (strenge, objekter etc.). Umiddelbart ser det ud
> til, at den tomme streng evaluerer til sand.

C har ikke en streng-type, man bruger normalt char[] eller *char.

Det kommer meget an på hvad du tester på:

$ cat sandfalsk.c
#include <stdio.h>

int main() {
char chararr[10] = "";
char *charptr = "";

printf("chararr: %u\n", *chararr);
printf("*chararr: %u\n", chararr);
printf("charptr: %u\n", charptr);
printf("*charptr: %u\n", *charptr);

return 0;
}
$ gcc -o sandfalsk sandfalsk.c
$ ./sandfalsk
chararr: 0
*chararr: 3221223952
charptr: 134513993
*charptr: 0

De to der er forskellige fra 0 er hukommelsesadresser, og eftersom de
ikke er 0 evaluerer de til sand i C.

--
Jacob
It's not a lie. It's just a very special kind of truth.

http://www.bunk.cc - nu med Emacs effekt

Jacob Bunk Nielsen (09-08-2001)
Kommentar
Fra : Jacob Bunk Nielsen


Dato : 09-08-01 14:27

"Niels Andersen" <niels-usenet@myplace.dk> writes:

> Jeg har leget med det, og det ser ud til at både or, ||, and og && stoppe
> evalueringen når resultatet kan afgøres.

Du tænker måske på hvad man opnår ved at lave noget i retning af:

if ($a == 1 | $b == 2)

Her skal begge udtryk evalueres, derefter laves der et bitvist eller
mellem dem. Når vi snakker boolean-værdier vil et bitvist eller være
det sammen som ||, og ovenstående vil i praksis virke som:

if ($a == 1 || $b == 2)

Hvor man bare evaluerer begge udtryk i stedet for kun at evaluere så
langt man nu er nødt til for at bestemme at udtrykket er sandt eller
falskt.

--
Jacob
Not better than sex but worth a try

http://www.bunk.cc - nu med Emacs effekt

Søg
Reklame
Statistik
Spørgsmål : 177560
Tips : 31968
Nyheder : 719565
Indlæg : 6408943
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste