|
| 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
| |
|
|