Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Интересная задачка

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
sKaa
Отправлено: 04 Июня, 2012 - 08:31:13
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


Я вот тут читал про особенности компиляторов C# и C++ и выяснил для себя такую новую вещь, что выражение
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. int i = 5; i = ++i + ++i;
  3.  

На разных языках дает разные ответы, 13 или 14, это происходит из-за того, что компилятор вправе понять и как
CODE (htmlphp):
скопировать код в буфер обмена
  1. tmp=i; i = tmp+1 + tmp+1; i++; i++;

и как
CODE (htmlphp):
скопировать код в буфер обмена
  1. tmp=i; i++; i++; i = tmp+1 + tmp+1;


Дочитав сабж решил проверить в php и Javascript
Итак :
PHP:
скопировать код в буфер обмена
  1.  
  2. $i = 5;
  3. $i = $i++ + $i++; // 11
  4.  

В том время как :
CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. var i = 5;
  3. i = i++ + i++; // 11
  4.  


Совсем другая картина происходит если :
PHP:
скопировать код в буфер обмена
  1.  
  2. $i = 5;
  3. $i = ++$i + ++$i; // 13
  4.  

В том время как :
CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. var i = 5;
  3. i = ++i + ++i; // 13
  4.  


Хотелось бы услышать именно от гуру почему операция инкремента справа и слева переменной дает разные результаты ? Я недоумеваю ))
 
 Top
EuGen Администратор
Отправлено: 04 Июня, 2012 - 09:41:20
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Постинкремент, в отличии от преинкремента, сохраняет старое значение во временную переменную и увеличивает переданную по ссылке переменную, но при этом возвращает старое значение.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Мелкий Супермодератор
Отправлено: 04 Июня, 2012 - 09:44:07
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




sKaa пишет:
Хотелось бы услышать именно от гуру почему операция инкремента справа и слева переменной дает разные результаты ?

Постинкремент сохраняет старое значение во временную переменную, увеличивает переданную по ссылке переменную, но возвращает старое значение.

Можно рассматривать как:
PHP:
скопировать код в буфер обмена
  1. function preincr(&$i) { //++$i
  2. $i = $i + 1;
  3. return $i;
  4. }
  5. function postincr(&$i) { //$i++
  6. $iold = $i;
  7. $i = $i+1;
  8. return $iold;
  9. }


-----
PostgreSQL DBA
 
 Top
sKaa
Отправлено: 04 Июня, 2012 - 09:54:04
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


Уважаемые EuGen и Мелкий, огромное спасибо. На счет форума вопроса долго думал куда спрашивать и решил сюда Улыбка Если тут не место перенесите, сорри )
 
 Top
sKaa
Отправлено: 08 Июня, 2012 - 11:48:01
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


Node.js :
CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. // Node js declare vars
  3. var
  4.         sys             = require('sys'),       // Console output
  5.         http            = require('http'),      // Http
  6.         fs                      = require('fs');        // File system
  7.        
  8. const
  9.         NODEJS_EOL = '\n\r',
  10.         SERVER_PORT = 8000;
  11.  
  12. http.createServer(      function (request, response) {
  13.                 response.writeHead(200, {'Content-Type' : 'text/plain'});
  14.                
  15.                 var i = 5;
  16.                
  17.                 response.write('i=5; write ++i + ++i; : ' + (++i + ++i) + '  ' + NODEJS_EOL);
  18.                
  19.                
  20.                 response.end();
  21.         }
  22. ).listen( SERVER_PORT );
  23.  
  24. sys.puts('Server running at 127.0.0.1:' + SERVER_PORT + '/');
  25.  


Результат работы :
CODE (htmlphp):
скопировать код в буфер обмена
  1. i=5; write ++i + ++i; : 13  

(Отредактировано автором: 08 Июня, 2012 - 12:17:35)

 
 Top
eai
Отправлено: 08 Июня, 2012 - 12:02:23
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 521
Дата рег-ции: Сент. 2009  
Откуда: Петроград


Помог: 10 раз(а)




sKaa пишет:
На разных языках дает разные ответы, 13 или 14, это происходит из-за того, что компилятор вправе понять и как


Я вот тут читал, вроде ответили все вам верно но не могу вкурить как можно 14 то получить.
Ерунда какая то ...
 
 Top
sKaa
Отправлено: 08 Июня, 2012 - 12:10:13
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


eai, на си шарпе и даже вроде perl и многом другом получается 14.
компилятор вправе понять как :
CODE (htmlphp):
скопировать код в буфер обмена
  1. tmp=i; i = tmp+1 + tmp+1; i++; i++;

если перевести на цифры то так :
tmp = 5; return 5+1 + 5+1 (=12); 12++ (=13); 13++ (=14);
 
 Top
eai
Отправлено: 08 Июня, 2012 - 12:20:09
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 521
Дата рег-ции: Сент. 2009  
Откуда: Петроград


Помог: 10 раз(а)




Какая то особая нетривиальная интерпретация прединкремента в С# и Perl


Перл как усегда выдавал перлы
 
 Top
sKaa
Отправлено: 08 Июня, 2012 - 12:20:39
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


Во всяком случае на php, javascript и даже node.js об этой проблеме можно не думать - я проверил Улыбка
 
 Top
EuGen Администратор
Отправлено: 08 Июня, 2012 - 12:40:06
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Цитата:
Perl — это единственный язык, программы на котором выглядят одинаково до и после RSA-шифрования.

Keith Bostic. Программист, создатель Sleepycat, конрибьютор BSD

По поводу PHP - разъяснения выше.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Мелкий Супермодератор
Отправлено: 08 Июня, 2012 - 12:43:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Самое весёлое в этом то, что на С++ результаты зависят от того, каким компилятором собирали Радость
Мораль - всегда ставьте скобки, когда есть даже тень неуверенности в порядке выполнения операций.


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB