#10351 [Com]: Parsing problem with nested ? : structures
| From: | story-lesbian1366 at hotmail dot com | Date: | Tue, 20 Jul 2004 15:00:54 +0000 |
| Subject: | #10351 [Com]: Parsing problem with nested ? : structures | ||
| References: | 1 | Groups: | php.doc |
| Request: | Send a blank email to phpdoc+get-969362027@lists.php.net to get a copy of this message | ||
ID: 10351
Comment by: story-lesbian1366 at hotmail dot com
Reported By: dwilson at cae dot wisc dot edu
Status: Open
Bug Type: Documentation problem
Operating System: Sun OS 5.7
PHP Version: 4.0.3pl1
New Comment:
<a href=http://h-black-transvestit.da.ru>lesbian
story</a>
Previous Comments:
------------------------------------------------------------------------
[2002-04-29 13:12:00] m dot ford at lmu dot ac dot uk
I think the key here is not precedence, but associativity. The ?:
operator is listed as being left-associative which, I think, means your
simplified example will be evaluated like this:
(1 ? (1 ? "3" : "2") : 1) ? "1" : "0"
which will, indeed, result in 1!
A right-associative ?: would be grouped as you expected, like this:
1 ? (1 ? "3" : "2") : (1 ? "1" : "0")
-- ergo, in C ?: must be right-associative!!
(As a side-note, operator associativity is listed in the operator
precedence table with no real explanation of what it means, or link to
such explanation -- perhaps this should be made a documentation feature
request?)
------------------------------------------------------------------------
[2002-04-29 10:34:57] dwilson at cae dot wisc dot edu
I checked, and < has a higher precedence than ?: as one
would expect. For example, with $dHour = 5, this is
equivalent to:
$departmeals = 1 ? 1 ? "3" : "2" : 1 ? "1" : "0";
which should evaluate to "3" but evaluates to "1" instead.
The C language has no trouble with this construction:
sun-66% cat temp.c
#include <stdio.h>
main(){
printf("%s\n",1 ? 1 ? "3" : "2" : 1 ? "1" :
"0");
}
sun-66% cc temp.c
sun-66% a.out
3
------------------------------------------------------------------------
[2002-04-27 15:19:22] jimw@php.net
it does execute correctly, given the relative precedence of the '<' and
'?:' operators.
------------------------------------------------------------------------
[2001-04-16 16:14:48] dwilson at cae dot wisc dot edu
The following statement does not execute correctly:
$departmeals = $dHour < 10.5 ? $dHour < 6.0 ? "3" : "2"
:
$dHour < 18.0 ? "1" : "0";
No error message--it just returns the wrong result. It does execute
correctly if parentheses are added:
$departmeals = $dHour < 10.5 ? ($dHour < 6.0 ? "3" : "2")
:
($dHour < 18.0 ? "1" : "0");
The original is not ambiguous; it should parse and execute correctly.
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=10351&edit=1