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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2011, 11:48   #11
Gen_r_questions
Пользователь
 
Регистрация: 13.02.2011
Сообщений: 81
По умолчанию

Вот такой еще вопросик
Когда строка проверяется не строгим равенством на true-false, false в каком случае возвратится?

Последний раз редактировалось Gen_r_questions; 17.02.2011 в 11:50.
Gen_r_questions вне форума Ответить с цитированием
Старый 17.02.2011, 12:14   #12
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от Gen_r_questions Посмотреть сообщение
Вот такой еще вопросик
Когда строка проверяется не строгим равенством на true-false, false в каком случае возвратится?
Да ну почитайте уже что-нибудь по PHP...

Ну вот хотя бы по этим вашим true-false .

Учитесь самостоятельно находить и анализировать нужную вам информацию - полно же всяких сайтов, + мануалы...
Это - часть работы программиста.

Книги здесь .
Andkorol вне форума Ответить с цитированием
Старый 17.02.2011, 16:25   #13
Gen_r_questions
Пользователь
 
Регистрация: 13.02.2011
Сообщений: 81
По умолчанию

Цитата:
Цикл с предусловием while работает по следующим принципам:
1.Вычисляется значение логического выражения.
2.Если значение истинно, выполняется тело цикла, в противном случае - переходим на следующий за циклом оператор.
Код:
 <?php
$array = array(
    fruit1 => "apple",
    fruit2 => "orange",
    fruit3 => "grape",
    fruit4 => "apple",
    fruit5 => "apple");
 
        reset($array);
while ($fruit_name = current($array)){
    if ($fruit_name == "apple")
        echo key($array)."<br>";
    next($array);
}
?>
current($array возвратил apple, $fruit_name присваивается apple, компилятор проверяет равняется ли $fruit_name true, что то вроде
Код:
if($fruit_name==true)
продолжаем цикл
А вот например если бы такой код был бы на C++, как бы компилятор проверял идти дальше циклу или нет, ведь там такое
Код:
if($fruit_name==true)
продолжаем цикл
запрещено
(там нельзя проверять строки на true - false)

Последний раз редактировалось Gen_r_questions; 17.02.2011 в 16:27.
Gen_r_questions вне форума Ответить с цитированием
Старый 17.02.2011, 17:09   #14
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от Gen_r_questions Посмотреть сообщение
А вот например если бы такой код был бы на C++, как бы компилятор проверял идти дальше циклу или нет, ведь там такое
Код:
if($fruit_name==true)
продолжаем цикл
запрещено
(там нельзя проверять строки на true - false)
При чём тут С++ вообще...???

Вы выполняете операцию сравнения(==) - она в любом случае возвращает boolean :
Цитата:
Это в своем роде уникальные операции, потому что независимо от типов своих аргументов они всегда возвращают одно из двух: false или true. Операции сравнения позволяют сравнивать два значения между собой и, если условие выполнено, возвращают true, а если нет — false.
А в PHP вот так определяются boolean :
Цитата:
Однако в большинстве случаев вам нет необходимости использовать приведение типа, поскольку значение будет автоматически преобразовано, если оператор, функция или управляющая конструкция требует булев аргумент.

При преобразовании в логический тип, следующие значения рассматриваются как FALSE:
Сам булев FALSE
целое 0 (ноль)
число с плавающей точкой 0.0 (ноль)
пустая строка и строка "0"
массив с нулевыми элементами
объект с нулевыми переменными-членами
специальный тип NULL (включая неустановленные переменные)

Все остальные значения рассматриваются как TRUE (включая любой ресурс).
Да - вот такой вот бардак происходит в языках,где нет строгой типизации...
Andkorol вне форума Ответить с цитированием
Старый 17.02.2011, 20:10   #15
Gen_r_questions
Пользователь
 
Регистрация: 13.02.2011
Сообщений: 81
По умолчанию

Мне интересно, как php обрабатывает этот
Код:
 <?php
$array = array(
    fruit1 => "apple",
    fruit2 => "orange",
    fruit3 => "grape",
    fruit4 => "apple",
    fruit5 => "apple");
 
        reset($array);
while ($fruit_name = current($array)){
    if ($fruit_name == "apple")
        echo key($array)."<br>";
    next($array);
}
?>
код, имею ввиду цикл
1 версия:
current($array) возвращает при первой итеграции цикла apple, $fruit_name присваивается apple(тк присоединение прошло удачно, возвращ-ся true, а если бы current($array) возвратил false, то $fruit_name-у нечего было бы присоединять и operator= выдал бы false, false передался бы while и цикл прекратился бы)

Или 2-ая версия:
current($array) возвратил apple, $fruit_name присваивается apple, компилятор проверяет равняется ли $fruit_name true, что то вроде
Код:
if($fruit_name==true)
продолжаем цикл
Или как то по-другому?
PS Первая версия отпадает !

Последний раз редактировалось Gen_r_questions; 17.02.2011 в 20:24.
Gen_r_questions вне форума Ответить с цитированием
Старый 17.02.2011, 20:37   #16
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от Gen_r_questions Посмотреть сообщение
1 версия:
current($array) возвращает при первой итеграции цикла apple, $fruit_name присваивается apple(тк присоединение прошло удачно, возвращ-ся true, а если бы current($array) возвратил false, то $fruit_name-у нечего было бы присоединять и operator= выдал бы false, false передался бы while и цикл прекратился бы)
Эта версия наиболее близка к правильному пониманию.

Уточнения:
- когда current() возвращает текущий элемент массива - то $fruit_name становится логическим TRUE не потому что "присоединение прошло удачно", а потому что этой переменной было присвоено не-нулевое или не-пустое значение.
В этом состоит неудобство использования этой функции для прохода по массиву,о чём указано в её описании:
Цитата:
Внимание

Если массив содержит пустые элементы (0 или "", пустая строка), эта функция возвратит FALSE для этих элементов. Это делает невозможным установить в действительности ли достигнут конец списка элементов массива при помощи функции current().
- когда current() возвращает FALSE(т.е. возможно массив полностью пройден) - это значение FALSE присваивается переменной $fruit_name (получается $fruit_name = FALSE).
Так как условие цикла while стало ложным($fruit_name) - цикл прекращается.
Andkorol вне форума Ответить с цитированием
Ответ


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

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

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