За последние 24 часа нас посетили 31940 программистов и 1380 роботов. Сейчас ищут 752 программиста ...

for($i = false;

Тема в разделе "Прочие вопросы по PHP", создана пользователем igordata, 10 авг 2015.

  1. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Нежданчик =)

    Код (PHP):
    1. for($i = false; $i < 5; $i++){
    2.   var_dump($i);
    3. } 
     
  2. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Код (PHP):
    1. $i = false;
    2. while($i === false){
    3.   var_dump($i);
    4.   $i++;
    5. } 
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    При этом $i + 1 это 1, а $i++ это "ахаха, попался"
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Это ты где нашел такое?
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну не в такой форме конечно, но сам написал ^__^
     
  6. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Я всегда думал, что $i++ работает как $i = $i+1;

    Интересно, как тогда происходит инкремент? Если он выдает такое.
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Читаем документацию, там это описано четко.
     
  8. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Так это ясно. Учитывая что
    получается когда мы пишем $i++ это не есть $i = $i+1; получается $i++; работает как то по другому?

    В случае
    Код (PHP):
    1. $i = false;
    2. $i = $i + 1; //тут срабатывает приведение типо false засчитывается как ноль и в итоге получаем 1.  
    Хочется понять как конкретно работает инкремент
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Блин, инкремент - это не краткая запись присвоения после работы оператора сложения с единичкой.
    Краткая запись бинарного оператора + с присвоением это +=

    $i= $i+1; идентично $i+=1;

    А инкремент и декремент - это самостоятельный унарный оператор. Не краткая запись.
    Как он работает - описано в документации. Как он устроен изнутри, ты можешь глянуть в исходниках PHP.
     
  10. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Ты все рассказал, но так и не получил ответа по вопросу.
    Ну то что он возвращает значение а потом увеличивает мне ясно.
    вопрос:
    Если никто не подскажет, наверно придется туда лезть и смотреть.
     
  11. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Кратко:
    Код (Text):
    1. $str = 'x';
    2. $str += 1;
    3. var_dump($str);
    4.  
    5. $str = 'x';
    6. $str++;
    7. var_dump($str);
    Долго:
    инкремент/декремент присваивает переменной следующее/предыдущее значение, не меняя тип. У значений булева типа нет приоритетов. А если бы был, то цикл быстро бы уперся в тупик.

    Барабум, эта прекрасная логика крашится об такие значения переменных:
    Код (Text):
    1. $str = ''; // превращается в string (!!!) "1". При повторном инкременте, превращается в int "2".
    2. $str = '0'; // превращается в int "1"
    3. $str = null; // превращается в int "1", хотя null должен быть полноценным типом с единственным значением и никакого инкремента быть не может
    Ну по крайней мере, курсив - верен. Все ведь знали, как перебрать алфавит в цикле?
     
  12. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    До сегодняшнего дня я не знал что можно применить оператор инкремента к символам.

    Код (PHP):
    1. $j = "a";
    2. for($i = 0; $i < 26; $i++){
    3.     echo $j++."<br>";
    4. }
     
  13. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Можно еще $j < "z" =)
     
  14. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Код (PHP):
    1. $j = TRUE;
    2. echo ++$j . "<br>";
    3.  
    4. //вывод
    5. //1
    6. //bool(true) 
    7.  
    8.  
    9. $j = NULL;
    10. echo ++$j . "<br>";
    11.  
    12. //вывод
    13. //1
    14. //int(1)        
    Почему так?

    Добавлено спустя 1 минуту 17 секунд:
    Но почему, нет ответа.

    Добавлено спустя 2 минуты 13 секунд:
    Код (PHP):
    1. $j = TRUE;
    2. echo ++$j . "<br>";
    3. echo ++$j . "<br>";
    4.  
    5. //вывод
    6. //1
    7. //1
    8. //bool(true) 
    9.  
    10.  
    11. $j = NULL;
    12. echo ++$j . "<br>";
    13. echo ++$j . "<br>";
    14.  
    15. //вывод
    16. //1
    17. //2
    18. //int(2)
    ДА, на boolean инкремент не влияет.
     
  15. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Потому что огурцы, и разрабы пыха прошляпили, а потом было лень исправлять. Поглядели, что в JS все еще печальнее с нулевыми типами, и решили, что у них вполне себе радуга.
     
  16. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    печально.
     
  17. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    туда же
    Код (PHP):
    1. count(false) 
     
  18. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А тут что не так? О_о count любой переменной будет 1.
     
  19. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Еще прикольнее привести false или любое другое значение к типу object
     
  20. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    То, что так написано в документации, не значит, что это нормально =)
     
  21. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    count считает количество элементов в передаваемой переменной. Если это массив или объект, будет возвращено количество их содержимого. Если просто одиночная переменная - будет возвращено 1. Это же не сишный size, показывающий, сколько байт под указателем лежит. Тут вполне логично все.

    И да, а что ты там ожидал увидеть?
     
  22. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    не хочу чтобы он вообще с не-массивами работал :D
     
  23. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    count также считает, что - то в объектах.
    От суда и вывод: переменная является объектом, по этому и считает.
     
  24. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Воу воу воу, палехчи, переменная это переменная. Объектов она не является, тут у нас не JS. Просто count возвращает количество чего-то переданного, пытаясь привести его к структуре. Переменная - структура из одного элемента для него.

    В тех же плюсах и шарпах, функции size работают со всем, что им передашь, точно так же. В плюсах вообще она возвращает размер блока памяти, занимаемого переменной. Чтобы длину массива посчитать, нужно длину блока памяти разделить на размер типа массива с учетом битности системы, если работаешь без выравнивания. Все ок.
     
  25. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    rodent90, ты на днях исправлял ошибки правописания, когда сам в той же яме то, зачем)))