За последние 24 часа нас посетили 215974 программиста и 2195 роботов. Сейчас ищут 1713 программистов ...

результат выполнения кода

Тема в разделе "PHP для новичков", создана пользователем vikrorpert, 10 ноя 2010.

  1. vikrorpert

    vikrorpert Активный пользователь

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    PHP:
    1.  
    2.  
    3. $arr = array('a' => '27', 'b' => '12', 'd' => '2alpha2');
    4. $tmpVar = &$arr['c'];
    5. $tmpVar = 2 / $arr['d'];
    6. echo $arr['a'] % $arr['b'] + $arr['c'];
    7.  
    Что отобразит следующий код и главное почему?
     
  2. asik

    asik Активный пользователь

    С нами с:
    12 июл 2007
    Сообщения:
    211
    Симпатии:
    0
    $arr['a'] % $arr['b'] = 3
    во 2-й и 3-й строке Вы присваиваете $arr['c'] = 2 / $arr['d'] т.е. $arr['c'] =1
    echo $arr['a'] % $arr['b'] + $arr['c'];
    выводит 4
     
  3. vikrorpert

    vikrorpert Активный пользователь

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    почему $arr['c'] =1 ??
     
  4. asik

    asik Активный пользователь

    С нами с:
    12 июл 2007
    Сообщения:
    211
    Симпатии:
    0
    $tmpVar = &$arr['c'];
    этой строкой ты говориш, что $tmpVar ссылается на память для переменной $arr['c']. т.е. изменяя $arr['c'] ты автоматом изменяеш и $tmpVar и наоборот, изменяя $tmpVar автоматом изменяется и $arr['c']. это одна и та-же переменная, просто названа по разному.
     
  5. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Фишка кода в том что во второй строке создаётся $arr['c'] со значением NULL а в 3-й (так как $tmpVar это просто ссылка на $arr['c']) ей присваивается int 1
    $arr = array('a' => '27', 'b' => '12', 'd' => '2alpha2');
    $arr['c'] = NULL
    $arr['c'] = 2 / $arr['d']; // $arr['d'] у нас переделывается в int и ровняется 2, 2/2=1
    а соответственно
    echo 27 % 12 + 1; // 4
     
  6. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    $arr['a'] % $arr['b'] = 3

    отобразит 4 потому что 2 / $arr['d'] дает в результате int(1) которая ибо по ссылке &$arr['c'] пихается в $arr['c'] и прибавляется к $arr['a'] % $arr['b']
     
  7. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    asik
    шустрее всех оказался :)
     
  8. asik

    asik Активный пользователь

    С нами с:
    12 июл 2007
    Сообщения:
    211
    Симпатии:
    0
    какая разница шустрее или нет?
     
  9. vikrorpert

    vikrorpert Активный пользователь

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    все равно не могу понять
    про ссылку я понял
    имеется ввиду что $arr['d'] считается int 2 байта? или '2alpha2' конвертится как 2?
     
  10. asik

    asik Активный пользователь

    С нами с:
    12 июл 2007
    Сообщения:
    211
    Симпатии:
    0
    конвертится как 2?
     
  11. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    intval('2alpha2'); // = 2
     
  12. asik

    asik Активный пользователь

    С нами с:
    12 июл 2007
    Сообщения:
    211
    Симпатии:
    0
    $arr = array('a' => '27', 'b' => '12', 'd' => '3alpha2');
    echo $arr['d'];
    выводит 3
     
  13. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Но вообще топик иллюстрирует неправильное проектирование, в реальной жизни, такой задачи возникнуть не должно (как теория оно может и интересно, но...)
     
  14. vikrorpert

    vikrorpert Активный пользователь

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    это тестовый вопрос
    согласен что на практике надо прогеру по пальцам дать за такое :)
     
  15. asik

    asik Активный пользователь

    С нами с:
    12 июл 2007
    Сообщения:
    211
    Симпатии:
    0
    а почему бы и нет?
     
  16. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    asik
    Хотя бы потому что 2alpha2 в реальной жизни (чтоб избежать неразберихи) надо просто зарезать как неправильный ввод (мы там число ждём, а пришёл текст, это первый признак того что что-то пошло не так)
    По той-же причине я считаю что получать числовые данные с помощью intval($_GET['траляля']) это неправильно, данные надо сначала проверить, и если они пришли нормально то ничего не надо никуда конвертировать без острой на то необходимости
     
  17. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    vikrorpert
    ссылка там. в ссылку пихается единица. ссылка указует на $arr['c']

    а почему 2alpha2 = 2 ответ: потому что такова специфика пхп.
     
  18. vikrorpert

    vikrorpert Активный пользователь

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    спасибо разобрался
     
  19. vikrorpert

    vikrorpert Активный пользователь

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    еще вопрос

    PHP:
    1.  
    2. function show() {
    3.     STATIC $count = 0;
    4.     return ++$count;
    5. }
    6. print show();
    7. print show();
    8. print show();
    9.  
    10.  
    почему тут выводится 123 , разве не будет каждый раз переинициализации переменной?
     
  20. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Слово
    именно и создано для того чтоб "нет"
     
  21. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    vikrorpert
    чувак, а че за тест? расскажи!