Bug #12566 Updated: Cascaded ternaries evaluate incorrectly
| From: | sterling@php.net | Date: | Sat, 13 Oct 2001 17:41:34 +0000 |
| Subject: | Bug #12566 Updated: Cascaded ternaries evaluate incorrectly | ||
| References: | 1 | Groups: | php.dev |
| Request: | Send a blank email to php-dev+get-67893@lists.php.net to get a copy of this message | ||
ID: 12566
Updated by: sterling
Reported By: nick@macaw.demon.co.uk
Old Status: Open
Status: Bogus
Bug Type: *Programming Data Structures
Operating System: Linux
PHP Version: 4.0.6
New Comment:
nope.
Previous Comments:
------------------------------------------------------------------------
[2001-08-04 17:21:33] jeroen@php.net
adam@trachtenberg.com:
> It's not a "bug," but a "feature." :)
>
> PHP has the inverse associativity of ?: compared to C (and every other
> language). This was originally a mistake, but now "it won't be changed,"
> due to historical reasons.
>
> See some messages I had on php-dev back around the first week of January,
> 2001 on this topic. FWIW, I would like to change it.
>
> -adam
So, you need to read it as:
echo (TRUE ? 'one' : TRUE) ? 'two' : 'unknown';,
and
echo 'one' ? 'two' : 'unknown' is, correctly, 'two'
Maybe a fix for PHP 4.1 / PHP 5?
------------------------------------------------------------------------
[2001-08-04 17:04:43] jeroen@php.net
Confirmed in latest CVS:
---
echo TRUE ? 'one' : TRUE ? 'two' : 'unknown';
=> two
---
echo TRUE ? 'one' : FALSE ? 'two' : 'unknown';
=> two
---
This definitely is a bug, and IMO a serious one. A parse error would be acceptable IMO (then use (
and )), but this isn't.
------------------------------------------------------------------------
[2001-08-04 15:33:28] nick@macaw.demon.co.uk
The following emits 'two' rather than 'one' as one would expect.
$a = 1; $b = 2;
echo (($a == 1) ? 'one' :
($b == 2) ? 'two' :
'unknown');
Apologies if for PHP this unusual behaviour actually is as expected, but being counter-intuituve,
and of course inconsistent from other languages with a ?: operator, this is an undesirable result.
In 'C', the following of course outputs 'one'
#include <stdio.h>
int main()
{
int a = 1, b = 2;
puts((a == 1) ? "one" :
(b == 2) ? "two" :
"unknown");
return 0;
}
------------------------------------------------------------------------
Edit this bug report at http://bugs.php.net/?id=12566&edit=1