Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.07.2011, 21:16   #1
alex455
Пользователь
 
Регистрация: 22.05.2011
Сообщений: 26
Вопрос $x = 0; while ($x++ < 10) echo $x."<br>" - почему выводит 10?

Код:
<?php

$x = 0; while ($x++ < 10) echo $x."<br>";

?>
Почему последнее выводимое число - 10? Ведь в цикле указано, что он выполняется пока $x менее 10. Если последнее выведенное число 10, значит, он выполнился при $x == 10.
alex455 вне форума Ответить с цитированием
Старый 11.07.2011, 21:22   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Десять? Странно, что не одиннадцать, ведь инкремент постфиксный.
Но в любом случае, $x становится равным десяти, условие в while проверяется, получаем ЛОЖЬ и только тогда цикл прерывается. Пока $x строго меньше 10, он будет увеличиваться.
netrino вне форума Ответить с цитированием
Старый 11.07.2011, 21:48   #3
graymaster
Форумчанин
 
Аватар для graymaster
 
Регистрация: 03.05.2011
Сообщений: 158
По умолчанию

Как раз и должно быть десять, потому что инкремент постфиксный.
Опустим циклы до тех пор, пока $x не будет равным 9-ти, тогда:
$x=9;
проверяется условие $x<10 получаем труъ.
Выполняем постфиксный инкремент $x++ и получаем $x=10
выводим $x, т.е. 10-ку.
снова проверяем условие $x<10, получаем не труъ, потому что 10 никак не меньше 10, после чего прекращаем циклические упражнения. (Соответственно, ничего уже никуда не выводим).
graymaster вне форума Ответить с цитированием
Старый 11.07.2011, 21:57   #4
VadikV
Форумчанин
 
Аватар для VadikV
 
Регистрация: 08.01.2011
Сообщений: 226
По умолчанию

Подводя итоги вышесказанному, нужно написать:
while (++$x < 10)
и будет тебе счастье
icq 223-630-454
e-mail vysotskiy@list.ru
сайт http://www.big-library.net/
VadikV вне форума Ответить с цитированием
Старый 11.07.2011, 22:03   #5
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от graymaster Посмотреть сообщение
Как раз и должно быть десять, потому что инкремент постфиксный.
Отнюдь, ведь постфиксный инкремент возвращает текущее значение переменной, а затем увеличивает её.
То есть, когда $x равен 9, то $x++ вернёт 9, а сам икс на той же итерации цикла станет 10, после, на следующей итерации, $x++ вернёт текущее значение икс (10) и увеличит икс на один (станет 11). И тогда уже цикл прервётся, так как 10 не меньше 10. Чтобы икс был равным 9, нужно
Код:
while (++$x < 9);
netrino вне форума Ответить с цитированием
Старый 11.07.2011, 22:11   #6
graymaster
Форумчанин
 
Аватар для graymaster
 
Регистрация: 03.05.2011
Сообщений: 158
По умолчанию

Хм. А я что написал ?
должно быть десять - это я имел в виду, что как раз по логике системы последнее выведенное число и должно быть 10.
Я написал ответ на недоумённый вопрос "Почему последнее выводимое число - 10?" ТС-а и сомнение "Десять? Странно, что не одиннадцать, ведь инкремент постфиксный. "
Я расписал по шагам выполнение программы и действия интерпретатора, надеясь, что это будет понятным. (начиная при икс = 9, с проверки условия)
Что ТСу действительно нужно - не известно, на самом деле, он просто недоумевал по поводу вывода в последней строке 10-ти, косвенно судя по остальному сообщению, можно предположить, что он ожидал получить последней строкой 9-ку.
ТС: А вообще, что бы жилось проще - для пересчёта "for" придумали, его реально проще применять в таких случаях, чем "while"
while (++$x < 9); - не пугайте так начинающих. Это вообще мои самые любимые ошибки, долго меня мучали, то и дело возвращаясь, пока форматтинг не начал делать на всё подряд Уберите в конце точку с запятой...
В таком случае, кстати, (если убрать всё же точку с запятой) будет досчитано только до 8-ми, но после выполнения икс будет равен 9-ти. Нужно нибо заменить инкремент на постфиксный, либо 9-ку на 10 что бы "досчитать" до 9-ти. Причём в случае постфиксного инкремента и 9-ки, икс после цикла будет равен 9-ти, а в случае 10-ки и префиксного - соответственно, 10-ти.

Последний раз редактировалось graymaster; 11.07.2011 в 22:29.
graymaster вне форума Ответить с цитированием
Старый 11.07.2011, 22:32   #7
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Ах да, всё верно. Мне почему-то показалось, что у ТС тоже после while точка с запятой стоит. Ну тогда да, последняя выведенная цифра будет 10
netrino вне форума Ответить с цитированием
Старый 12.07.2011, 19:17   #8
alex455
Пользователь
 
Регистрация: 22.05.2011
Сообщений: 26
По умолчанию

Цитата:
ТС: А вообще, что бы жилось проще - для пересчёта "for" придумали, его реально проще применять в таких случаях, чем "while"
Я изучаю PHP; до применения ещё далеко. Посему нужно разобраться со всеми вещами. Спасибо за объяснение, понял.
alex455 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Почему не работает Case txt Like "текст1", "текст2" Oooleg Microsoft Office Excel 2 15.07.2009 10:08
Выводит ошибку "Unclarified identifier", хотя недавно запускалась в другой программе Alex Cones Общие вопросы Delphi 2 20.04.2009 21:31
запрашивает ввод времени суток и в зависимости от этого выводит на экран "Доброе утро", "Добрый день". Maria, Russia Помощь студентам 5 17.02.2009 21:44