Форумы портала PHP.SU » » Вопросы новичков » Интересная задачка

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

1. sKaa - 04 Июня, 2012 - 08:31:13 - перейти к сообщению
Я вот тут читал про особенности компиляторов 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.  


Хотелось бы услышать именно от гуру почему операция инкремента справа и слева переменной дает разные результаты ? Я недоумеваю ))
2. EuGen - 04 Июня, 2012 - 09:41:20 - перейти к сообщению
Постинкремент, в отличии от преинкремента, сохраняет старое значение во временную переменную и увеличивает переданную по ссылке переменную, но при этом возвращает старое значение.
3. Мелкий - 04 Июня, 2012 - 09:44:07 - перейти к сообщению
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. }
4. sKaa - 04 Июня, 2012 - 09:54:04 - перейти к сообщению
Уважаемые EuGen и Мелкий, огромное спасибо. На счет форума вопроса долго думал куда спрашивать и решил сюда Улыбка Если тут не место перенесите, сорри )
5. sKaa - 08 Июня, 2012 - 11:48:01 - перейти к сообщению
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  
6. eai - 08 Июня, 2012 - 12:02:23 - перейти к сообщению
sKaa пишет:
На разных языках дает разные ответы, 13 или 14, это происходит из-за того, что компилятор вправе понять и как


Я вот тут читал, вроде ответили все вам верно но не могу вкурить как можно 14 то получить.
Ерунда какая то ...
7. sKaa - 08 Июня, 2012 - 12:10:13 - перейти к сообщению
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);
8. eai - 08 Июня, 2012 - 12:20:09 - перейти к сообщению
Какая то особая нетривиальная интерпретация прединкремента в С# и Perl


Перл как усегда выдавал перлы
9. sKaa - 08 Июня, 2012 - 12:20:39 - перейти к сообщению
Во всяком случае на php, javascript и даже node.js об этой проблеме можно не думать - я проверил Улыбка
10. EuGen - 08 Июня, 2012 - 12:40:06 - перейти к сообщению
Цитата:
Perl — это единственный язык, программы на котором выглядят одинаково до и после RSA-шифрования.

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

По поводу PHP - разъяснения выше.
11. Мелкий - 08 Июня, 2012 - 12:43:36 - перейти к сообщению
Самое весёлое в этом то, что на С++ результаты зависят от того, каким компилятором собирали Радость
Мораль - всегда ставьте скобки, когда есть даже тень неуверенности в порядке выполнения операций.

 

Powered by ExBB FM 1.0 RC1