Bug #12566 Updated: Cascaded ternaries evaluate incorrectly

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

« previous php.dev (#67893) next »