#10351 [Opn->Csd]: Parsing problem with nested ? : structures

From: Date: Mon, 26 Jul 2004 13:25:02 +0000
Subject: #10351 [Opn->Csd]: Parsing problem with nested ? : structures
References: 1  Groups: php.doc 
Request: Send a blank email to phpdoc+get-969362170@lists.php.net to get a copy of this message
ID: 10351 Updated by: vrana@php.net Reported By: dwilson at cae dot wisc dot edu -Status: Open +Status: Closed Bug Type: Documentation problem Operating System: Sun OS 5.7 PHP Version: 4.0.3pl1 New Comment: This bug has been fixed in the documentation's XML sources. Since the online and downloadable versions of the documentation need some time to get updated, we would like to ask you to be a bit patient. Thank you for the report, and for helping us make our documentation better. 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

« previous php.doc (#969362170) next »