2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4  След.
 
 Re: Вопросы по реализации калькулятора. Си.
Сообщение18.03.2014, 22:51 
Заслуженный участник


02/08/11
6895
venco в сообщении #838449 писал(а):
Вы полагаете будет разница?
Да, полагал до сего момента. Не знал, что можно применять логические операции к вещественным числам. Тем более нельзя писать if(!x), так как получается конструкция с неожиданным поведением.

 Профиль  
                  
 
 Re: Вопросы по реализации калькулятора. Си.
Сообщение18.03.2014, 23:18 
Заслуженный участник


28/04/09
1933
warlock66613 в сообщении #838453 писал(а):
Не знал, что можно применять логические операции к вещественным числам. Тем более нельзя писать if(!x), так как получается конструкция с неожиданным поведением.
Так к вещественным и нельзя применять. Логическая операция применяется к значению типа int (C) или bool (C++), в которое будет неявно сконвертировано x. Поведение вполне ожидаемо и полностью соответствует обоим стандартам.

 Профиль  
                  
 
 Re: Вопросы по реализации калькулятора. Си.
Сообщение18.03.2014, 23:40 
Заслуженный участник


04/05/09
4582
EtCetera в сообщении #838464 писал(а):
warlock66613 в сообщении #838453 писал(а):
Не знал, что можно применять логические операции к вещественным числам. Тем более нельзя писать if(!x), так как получается конструкция с неожиданным поведением.
Так к вещественным и нельзя применять. Логическая операция применяется к значению типа int (C) или bool (C++), в которое будет неявно сконвертировано x. Поведение вполне ожидаемо и полностью соответствует обоим стандартам.
Да что вы говорите? Могли бы и проверить, прежде чем писать.
Приведение double/char/int/long/ptr к bool типу - это в точности сравнение с нулём.
Если 0 - false, не 0 - true. То же самое и с самим bool, кстати.

-- Вт мар 18, 2014 16:44:39 --

warlock66613 в сообщении #838453 писал(а):
venco в сообщении #838449 писал(а):
Вы полагаете будет разница?
Да, полагал до сего момента. Не знал, что можно применять логические операции к вещественным числам. Тем более нельзя писать if(!x), так как получается конструкция с неожиданным поведением.
Почему же оно неожиданное? Вполне логичное сравнение со значением "по-умолчанию", например, для статических переменных.

 Профиль  
                  
 
 Re: Вопросы по реализации калькулятора. Си.
Сообщение19.03.2014, 00:17 
Заслуженный участник


02/08/11
6895
venco в сообщении #838466 писал(а):
Почему же оно неожиданное?
Да вот поэтому:
EtCetera в сообщении #838464 писал(а):
Так к вещественным и нельзя применять. Логическая операция применяется к значению типа int (C) или bool (C++), в которое будет неявно сконвертировано x. Поведение вполне ожидаемо и полностью соответствует обоим стандартам.
EtCetera в точности сформулировал ожидаемое поведение, практически слово в слово с моими мыслями. И даже не просто ожидаемое, а "полностью соответствует обоим стандартам". А, оказывается, оно и не такое совсем.

-- 19.03.2014, 01:23 --

venco в сообщении #838466 писал(а):
Приведение double/char/int/long/ptr к bool типу - это в точности сравнение с нулём.
Вот только оно вообще не приводится к bool.!(1.0) - это не false и не 0. И в C и в C++ это, внезапно, 0.0. UPDATE: нет, всё-таки !(1.0), равно как и !(0.3), - это целочисленный 0 и в C и в C++. То есть оно приводится к int, но так, как если бы приводилось к bool. Особенно странно это в Си, где нет bool.

 Профиль  
                  
 
 Re: Вопросы по реализации калькулятора. Си.
Сообщение19.03.2014, 00:24 
Аватара пользователя


22/09/09

1907
venco в сообщении #838466 писал(а):
Могли бы и проверить, прежде чем писать.
А на чем проверить? Вот несколько источников:
Цитата:
Следует с осторожностью использовать неявное приведение типа. При переводе числа из вещественного типа в целочисленный, дробная часть отсекается. (Википедия, Приведение типа)
Цитата:
В различных реализациях Си приведение типов осуществляется по-разному. [...] Если значение вещественного типа (float) преобразуется в целое и если оно выйдет из диапазона допустимых значений для целых, то призойдет ошибка преобразования и полученный результат преобразования будет немобильным (и непредсказуемым). (Р.Уинер, Язык Турбо Си, М.:Мир, 1991, С.105)
В более свежих источниках типа Б.Эккель, Философия С++, СПб.: Питер, 2004, на такие мелочи, как преобразование из вещественного в целое, вообще внимания не тратят, кратко сказали про очевидное преобразование из целого в вещественное (С.131) и пошли дальше про глубины "философии" рассуждать ;-) Интересно, а что на эту тему сказано в стандартах? И часто ли выполняются эти требования стандартов в конкретных компиляторах? ;-)

 Профиль  
                  
 
 Re: Вопросы по реализации калькулятора. Си.
Сообщение19.03.2014, 00:27 
Заслуженный участник


02/08/11
6895
bin, дело как раз в том, что в if(0.3) вообще нет ни одного приведения типа. Признайтесь, вы тоже этого не ожидали?

 Профиль  
                  
 
 Re: Вопросы по реализации калькулятора. Си.
Сообщение19.03.2014, 00:31 
Аватара пользователя


22/09/09

1907
warlock66613,
По секрету признаюсь, что я навидался таких чудес в С/С++, что уже ожидаю от них всего... :D

 Профиль  
                  
 
 Re: Вопросы по реализации калькулятора. Си.
Сообщение19.03.2014, 00:33 
Заслуженный участник


04/05/09
4582
warlock66613 в сообщении #838479 писал(а):
bin, дело как раз в том, что в if(0.3) вообще нет ни одного приведения типа. Признайтесь, вы тоже этого не ожидали?
Есть. Просто приведение к bool - это как раз сравнение с нулём. И в стандарте это написано.

 Профиль  
                  
 
 Re: Вопросы по реализации калькулятора. Си.
Сообщение19.03.2014, 00:38 
Аватара пользователя


22/09/09

1907
venco в сообщении #838485 писал(а):
Есть. Просто приведение к bool - это как раз сравнение с нулём. И в стандарте это написано.
Вас не затруднит процитировать это место из стандарта с указанием ссылки с точностью до страницы? В каких из распространенных компиляторах это место стандарта реализовано? Очень интересно узнать!

 Профиль  
                  
 
 Re: Вопросы по реализации калькулятора. Си.
Сообщение19.03.2014, 00:40 
Заслуженный участник


04/05/09
4582
warlock66613 в сообщении #838475 писал(а):
venco в сообщении #838466 писал(а):
Почему же оно неожиданное?
Да вот поэтому:
EtCetera в сообщении #838464 писал(а):
Так к вещественным и нельзя применять. Логическая операция применяется к значению типа int (C) или bool (C++), в которое будет неявно сконвертировано x. Поведение вполне ожидаемо и полностью соответствует обоим стандартам.
EtCetera в точности сформулировал ожидаемое поведение, практически слово в слово с моими мыслями. И даже не просто ожидаемое, а "полностью соответствует обоим стандартам". А, оказывается, оно и не такое совсем.
Так проблема в том, что сначала придумываются нелогичные ожидания, а потом EtCetera перестаёт пользоваться логичной конструкцией, потому что эти ожидания нелогичны. Да и ещё другим советует.
Мой вопрос - откуда вы взяли эти нелогичные ожидания? В стандарте их нет.

warlock66613 в сообщении #838475 писал(а):
venco в сообщении #838466 писал(а):
Приведение double/char/int/long/ptr к bool типу - это в точности сравнение с нулём.
Вот только оно вообще не приводится к bool. !(1.0) - это не false и не 0. И в C и в C++ это, внезапно, 0.0.
Опять придумываете? Всё логично - !(1.0) именно false в C++ и 0 в C.

 Профиль  
                  
 
 Re: Вопросы по реализации калькулятора. Си.
Сообщение19.03.2014, 00:48 
Заслуженный участник


28/04/09
1933
venco в сообщении #838466 писал(а):
EtCetera в сообщении #838464 писал(а):
Логическая операция применяется к значению типа int (C) или bool (C++), в которое будет неявно сконвертировано x. Поведение вполне ожидаемо и полностью соответствует обоим стандартам.
Да что вы говорите? Могли бы и проверить, прежде чем писать.
Приведение double/char/int/long/ptr к bool типу - это в точности сравнение с нулём.
Если 0 - false, не 0 - true. То же самое и с самим bool, кстати.
Да, прошу прощения. В случае C Вы правы:
Стандарты языков C99, C11 в 5-м абзаце параграфа "6.5.3.3 Unary arithmetic operators" писал(а):
The result of the logical negation operator ! is 0 if the value of its operand compares
unequal to 0, 1 if the value of its operand compares equal to 0. The result has type int.
The expression !E is equivalent to (0==E).
В случае C++, по-моему, нет (подчеркнуты различия для разных стандартов языка):
Стандарт языка C++03 в 8-м абзаце параграфа "5.3.1 Unary operators [expr.unary.op]" писал(а):
The operand of the logical negation operator ! is implicitly converted to bool (clause 4); its value is true if the converted operand is false and false otherwise. The type of the result is bool.
Стандарт языка C++11 в 8-м абзаце параграфа "5.3.1 Unary operators [expr.unary.op]" писал(а):
The operand of the logical negation operator ! is contextually converted to bool (clause 4); its value is true if the converted operand is false and false otherwise. The type of the result is bool.
А в разделе 4 значится следующее:
Стандарт языка C++03 в 1-м абзаце параграфа "4.12 Boolean conversions [conv.bool]" писал(а):
An rvalue of arithmetic, enumeration, pointer, or pointer to member type can be converted to an rvalue of type bool. A zero value, null pointer value, or null member pointer value is converted to false; any other value is converted to true.
Стандарт языка C++11 в 1-м абзаце параграфа "4.12 Boolean conversions [conv.bool]" писал(а):
A prvalue of arithmetic, unscoped enumeration, pointer, or pointer to member type can be converted to a prvalue of type bool. A zero value, null pointer value, or null member pointer value is converted to false; any other value is converted to true. A prvalue of type std::nullptr_t can be converted to a prvalue of type bool; the resulting value is false.

 Профиль  
                  
 
 Re: Вопросы по реализации калькулятора. Си.
Сообщение19.03.2014, 00:49 
Заслуженный участник


02/08/11
6895
venco в сообщении #838492 писал(а):
Всё логично - !(1.0) именно false в C++ и 0 в C.
Да, тут вы правы. Ну, кроме того, что это логично.

 Профиль  
                  
 
 Re: Вопросы по реализации калькулятора. Си.
Сообщение19.03.2014, 00:50 
Заслуженный участник


04/05/09
4582
bin в сообщении #838490 писал(а):
venco в сообщении #838485 писал(а):
Есть. Просто приведение к bool - это как раз сравнение с нулём. И в стандарте это написано.
Вас не затруднит процитировать это место из стандарта с указанием ссылки с точностью до страницы?
Бумажный стандарт у меня на работе. Так что воспользуюсь другим источником: http://en.cppreference.com/w/cpp/language/implicit_cast, ищите Boolean conversions.
bin в сообщении #838490 писал(а):
В каких из распространенных компиляторах это место стандарта реализовано? Очень интересно узнать!
Признайтесь - вы ведь тоже не удосужились проверить, как это обрабатывает ваш компилятор? Если же он работает не по стандарту, то мне будет интересно узнать, что это за компилятор.

-- Вт мар 18, 2014 17:55:59 --

EtCetera в сообщении #838497 писал(а):
В случае C++, по-моему, нет (подчеркнуты различия для разных стандартов языка):
Не заметил существенной разницы. Вы не уточните, в чём она?
Что я увидел - это уточнение контекста (implicitly/contextually), и замена 0 в контексте указателей на null pointer value.

 Профиль  
                  
 
 Re: Вопросы по реализации калькулятора. Си.
Сообщение19.03.2014, 00:59 
Заслуженный участник


28/04/09
1933
venco в сообщении #838500 писал(а):
EtCetera в сообщении #838497 писал(а):
В случае C++, по-моему, нет (подчеркнуты различия для разных стандартов языка):
Не заметил существенной разницы. Вы не уточните, в чём она?
Что я увидел - это уточнение контекста (implicitly/contextually), и замена 0 в контексте указателей на null pointer value.
Я как раз и подчеркнул, чтобы показать, что разницы между стандартами C++ в данном вопросе нет. :-) А вот от стандарта C отличие налицо.

 Профиль  
                  
 
 Re: Вопросы по реализации калькулятора. Си.
Сообщение19.03.2014, 01:10 
Заслуженный участник


04/05/09
4582
EtCetera в сообщении #838503 писал(а):
Я как раз и подчеркнул, чтобы показать, что разницы между стандартами C++ в данном вопросе нет. :-) А вот от стандарта C отличие налицо.
Ну разница вполне объяснима отсутствием в C типа bool. По результатам-же одно и то же получается.
Ок, консенсус.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 51 ]  На страницу Пред.  1, 2, 3, 4  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: mihaild


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group