EOMY.NET
Хостинг EOMY.NET: Форум поддержки
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
RSS Feed  

Парадокс работы с арифметикой в echo

 
Начать новую тему   Ответить на тему    Список форумов EOMY.NET -> Программирование для WEB
Парадокс работы с арифметикой в echo
Автор Сообщение
Magnum
Хостинг — это наше всё!
Хостинг — это наше всё!


Зарегистрирован: 25.07.2006
Сообщения: 142

8963 Монеты

СообщениеДобавлено: Вт, 17 Авг, 2010 20:20    Заголовок сообщения: Парадокс работы с арифметикой в echo Ответить с цитатой

Собственно задали вопрос. Суть вопроса в чем, есть код:
Код:
<?php
    echo "Сложение " . 5 + 3 ."<br />";
    echo "Вычитаие ". 5 - 3 ."<br />";
    echo "Умножение ". 5 * 3 ."<br />";
    echo "Деление ". 5 / 3 ."<br />";
    echo "Остаток от деления ". 5 % 3;
?>


Но вопреки логике результатом работы данной уникально вещи является:
Цитата:
3
-3
Умножение 15
Деление 1.6666666666667
Остаток от деления 2


Вместо логического:
Цитата:
Сложение 8
Вычитание 2
Умножение 15
Деление 1.6666666666667
Остаток от деления 2


На что я толком ответа не нашел ни в своей копилке знаний, ни в инете. Объясните в чем заключается ядерная мощь этого парадокса
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
madhamster
Согнул ложку
Согнул ложку


Зарегистрирован: 09.10.2006
Сообщения: 902

460 Монеты

СообщениеДобавлено: Вт, 17 Авг, 2010 20:39    Заголовок сообщения: Ответить с цитатой

Хз могу только сказать что в подобной ситуации конкатенцаию следует производить через запятую, а не точку.

Код:

<?php
    echo "Сложение " , 5 + 3 ,"<br />";
    echo "Вычитаие ", 5 - 3 ,"<br />";
    echo "Умножение ", 5 * 3 ,"<br />";
    echo "Деление ", 5 / 3 ,"<br />";
    echo "Остаток от деления ", 5 % 3;
?>


Либо группировать арифметические операции скобками.
_________________
NextStage - live music competition
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Magnum
Хостинг — это наше всё!
Хостинг — это наше всё!


Зарегистрирован: 25.07.2006
Сообщения: 142

8963 Монеты

СообщениеДобавлено: Вт, 17 Авг, 2010 20:43    Заголовок сообщения: Ответить с цитатой

Хм.. подобное редко где увидишь, спасибо будем знать. Но сам факт почем оно так себя видет для меня остался загадкой =)
_________________
Я не волшебник. Я всего лишь учусь =)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
[LP]LordPro.teus
Призрак Лорда
Призрак Лорда


Зарегистрирован: 26.07.2007
Сообщения: 5123

44732 Монеты

СообщениеДобавлено: Вт, 17 Авг, 2010 20:50    Заголовок сообщения: Ответить с цитатой

Magnum
Практика кодинга на PHP показывает, что всегда лучше расставить скобки при арифметике в конкатенации Smile И не только с числами - но и с переменными - долго потом будете искать, в чем проблема...
_________________

А ведь еще не поздно смотаться на Азовское море, согреться на солнышке...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Magnum
Хостинг — это наше всё!
Хостинг — это наше всё!


Зарегистрирован: 25.07.2006
Сообщения: 142

8963 Монеты

СообщениеДобавлено: Вт, 17 Авг, 2010 22:09    Заголовок сообщения: Ответить с цитатой

Ну теории я и практика малость всегда отличаются. Вот так и здесь. В теории ожидается один ответ, а на практике получаем совсем иное =)
Ладно бы если оно поступало так со всеми действиями в примере, а то ж нет, ему не понравилось сложение и вычитание =)
Вполне вероятно, что это баг самого PHP. Как говорится такой вариант не исключен =)
_________________
Я не волшебник. Я всего лишь учусь =)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
vohomov
Хостинг — это наше всё!
Хостинг — это наше всё!


Зарегистрирован: 17.07.2009
Сообщения: 195

23338 Монеты

СообщениеДобавлено: Ср, 29 Июн, 2011 22:30    Заголовок сообщения: Ответить с цитатой

Это не баг. Так и должно быть, ведь операция конкатенации имеет приоритет перед сложением и вычитанием (в случае отсутствия скобок). Это как в арифметике - сначала умножение, а потом сложение. Конкретно в вашем случае конкатенация приводит к образованию строки, а уже к этой строке вы пытаетесь прибавить/отнять число 3, что неправильно - типы разные, и PHP просто добавляет 3 или -3 к полученной ранее строке. Чтобы была именно арифметика, вам нужно заключить сложение / вычитание в скобки (как вам уже здесь ответили). В таком случае PHP сначала выполнит 5 - 3 (то есть операцию с числами, а не строками), а затем получившееся число 2 присоединит к заданной текстовой строке с помощью конкатенации. А с делением у вас всё получилось сразу, потому как деление 5 на три - это по сути умножение (5 умножить на 1/3), а конкатенация - логическое сложение. Умножение по приоритету выше сложения (опять же, как в арифметике), и PHP без всяких скобок всё делает так, как надо. Таким образом, всё верно и логично, никаких багов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов EOMY.NET -> Программирование для WEB Часовой пояс: GMT
Страница 1 из 1

 


Rambler's Top100   Рейтинг@Mail.ru    



Powered by phpBB © 2001, 2005 phpBB Group