[prev in list] [next in list] [prev in thread] [next in thread] 

List:       phpdoc
Subject:    [PHP-DOC] #36523 [Bgs]: Implies That 0 Evaluates True
From:       colder () php ! net
Date:       2006-02-26 19:27:08
Message-ID: 200602261927.k1QJR8Nu002850 () ez1 ! php ! net
[Download RAW message or body]

 ID:               36523
 Updated by:       colder@php.net
 Reported By:      rjnewton at efn dot org
 Status:           Bogus
 Bug Type:         Documentation problem
 Operating System: Windows XP
 PHP Version:      Irrelevant
 New Comment:

The manual is correct. Your statement is bogus, even with the
corrections.

do { /* code in the block*/ } while(0); executes the code in the block
*once* as the condition is evaluated *after* the first loop. The only
advantage you have is that you can use "break" to skip the rest of the
block.

So:

/* some code */
if ($var === true) {
  /* some other code */
}

could be written

do {
  /* some code */
  if ($var !== true) {
    break;
  }
  /* some other code */
} while(0);

This behaviour is explained correctly in the manual, so please let this
bug report closed.


Previous Comments:
------------------------------------------------------------------------

[2006-02-25 23:41:09] nlopess@php.net

The code is right.

------------------------------------------------------------------------

[2006-02-25 23:19:32] rjnewton at efn dot org

"Advanced C users may be familiar with a different usage of the
do-while loop, to allow stopping execution in the middle of code
blocks, by encapsulating them with do-while (0), and using the break
statement. The following code fragment demonstrates this: "

The above appeared in the PHP Manual (php_manual_en.chm) downloaded
within the past five days from this site.  The location within the
manual is provided in my correction of the original post.

Yes, of course this is bogus.  That is why I am making an effort to get
it corrected.  Please read and comprehend before commenting in the
future.

------------------------------------------------------------------------

[2006-02-25 12:47:33] colder@php.net


do { /* this code will be executed once */ } while (0);

I wonder where you saw that while(0) will produce an endless loop until
break;. 

Using a do-while(0) allows you to break it at the middle of the block,
that's all.

anyway: "Don't worry if you don't understand this right away or at all.
You can code scripts and even powerful scripts without using this
'feature'."

------------------------------------------------------------------------

[2006-02-25 03:01:26] rjnewton at efn dot org

Documentation reference should have been Language Reference|Control
Structures|do-while rather than Language
Reference|Control Structures|while.

Also, "thus $ < 5 will evaluate true." Should have been "thus $i < 5
will evaluate true." in the Expected Results section.
Sorry,

Joseph

------------------------------------------------------------------------

[2006-02-25 02:48:44] rjnewton at efn dot org

Description:
------------
Current PHP manual [Tue Nov 22 00:57:49 2005] suggests under Language
Reference|Control Structures|while that while(0) keeps a loop in play
until a break condition occurs.  This is the reverse of the actual
case.

Reproduce code:
---------------
<?php
$i = 12;
$factor = 0.5;
$minimum_limit = 2;
do {
    if ($i < 5) {
        echo "i is not big enough\n";
        break;
    }
    $i *= $factor;
    if ($i < $minimum_limit) {
        break;
    }
   echo "i is ok\n";

    /* process i */

} while (0);
?> 

Expected result:
----------------
Should make two full passes through the loop, the exit at the first if
statement of the third loop, since $i will then be 3, thus $ < 5 will
evaluate true.  This is the behavior when while(1) is used as the
control condition.



Actual result:
--------------
using while(0):
D:\newtonj\PHPstuff>php hello.php
i is ok


using while(1):
D:\newtonj\PHPstuff>php hello.php
i is ok
i is ok
i is not big enough




------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=36523&edit=1
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic