Bug #10351 Updated: Parsing problem with nested ? : structures
ID: 10351 Updated by: [EMAIL PROTECTED] Reported By: [EMAIL PROTECTED] Status: Open Bug Type: Feature/Change Request Operating System: Sun OS 5.7 PHP Version: 4.0.3pl1 New Comment: 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?) Previous Comments: [2002-04-29 11:13:40] [EMAIL PROTECTED] See comment starting with "I checked...". [2002-04-29 10:34:57] [EMAIL PROTECTED] 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 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] [EMAIL PROTECTED] it does execute correctly, given the relative precedence of the '<' and '?:' operators. [2001-04-16 16:14:48] [EMAIL PROTECTED] 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
Bug #10351 Updated: Parsing problem with nested ? : structures
ID: 10351 Updated by: [EMAIL PROTECTED] Reported By: [EMAIL PROTECTED] -Status: Closed +Status: Open Bug Type: Feature/Change Request Operating System: Sun OS 5.7 PHP Version: 4.0.3pl1 New Comment: See comment starting with "I checked...". Previous Comments: [2002-04-29 10:34:57] [EMAIL PROTECTED] 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 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] [EMAIL PROTECTED] it does execute correctly, given the relative precedence of the '<' and '?:' operators. [2001-04-16 16:14:48] [EMAIL PROTECTED] 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
Bug #10351 Updated: Parsing problem with nested ? : structures
ID: 10351 Updated by: [EMAIL PROTECTED] Reported By: [EMAIL PROTECTED] Status: Closed Bug Type: Feature/Change Request Operating System: Sun OS 5.7 PHP Version: 4.0.3pl1 New Comment: 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 main(){ printf("%s\n",1 ? 1 ? "3" : "2" : 1 ? "1" : "0"); } sun-66% cc temp.c sun-66% a.out 3 Previous Comments: [2002-04-27 15:19:22] [EMAIL PROTECTED] it does execute correctly, given the relative precedence of the '<' and '?:' operators. [2001-04-16 16:14:48] [EMAIL PROTECTED] 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
Bug #10351 Updated: Parsing problem with nested ? : structures
ID: 10351 Updated by: [EMAIL PROTECTED] Reported By: [EMAIL PROTECTED] -Status: Open +Status: Closed Bug Type: Feature/Change Request Operating System: Sun OS 5.7 PHP Version: 4.0.3pl1 New Comment: it does execute correctly, given the relative precedence of the '<' and '?:' operators. Previous Comments: [2001-04-16 16:14:48] [EMAIL PROTECTED] 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