2014 dxdy logo

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

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




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


02/08/11
6892
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
6892
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
6892
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
6892
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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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