Простая задачка :)
От: ilvi Россия  
Дата: 19.03.09 05:23
Оценка:
Что выведет программа :


#include <iostream>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
 try
 {
   double f1 = 1;
   double f2 = 0;

   double f3 = f1 / f2;

   std::cout << "Wow!" << std::endl;
 }
 catch(...)
 {
   std::cout << "Fine!" << std::endl;
 }

 return 0;
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Простая задачка :)
От: Андрей Тарасевич Беларусь  
Дата: 19.03.09 05:40
Оценка: +2
Здравствуйте, ilvi, Вы писали:

I>Что выведет программа :


Поведение не определено, поэтому гадать о том, что "выведет" эта программа, нет совершенно никакого смысла.
Best regards,
Андрей Тарасевич
Re[2]: Простая задачка :)
От: ilvi Россия  
Дата: 19.03.09 06:09
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>Здравствуйте, ilvi, Вы писали:


I>>Что выведет программа :


АТ>Поведение не определено, поэтому гадать о том, что "выведет" эта программа, нет совершенно никакого смысла.


Угу. И в новом стандарте таковым остается.
Легкий вопрос оказался
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Простая задачка :)
От: Аноним  
Дата: 19.03.09 07:35
Оценка:
Здравствуйте, ilvi, Вы писали:

I>Что выведет программа :


Естественно Wow!
Деление с плавающей точкой даст результат что-то типа #.INF но ни к каким ошибкам не приведет.
Re[2]: Простая задачка :)
От: MaxGl Украина  
Дата: 19.03.09 07:53
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Естественно Wow!
А>Деление с плавающей точкой даст результат что-то типа #.INF но ни к каким ошибкам не приведет.
Проверил на g++ (GCC) 4.1.2 — действительно результат inf.
#include <iostream>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
 try
 {
   double f1 = 1;
   double f2 = 0;

   double f3 = f1 / f2;

   std::cout << "Wow!" << std::endl;
   std::cout << f1 << ", " << f2  << ", " << f3  << ", " << std::endl;
 }
 catch(...)
 {
   std::cout << "Fine!" << std::endl;
 }

 return 0;
}


Wow!
1, 0, inf,

Re[2]: Простая задачка :)
От: ilvi Россия  
Дата: 19.03.09 08:17
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, ilvi, Вы писали:


I>>Что выведет программа :


А>Естественно Wow!

А>Деление с плавающей точкой даст результат что-то типа #.INF но ни к каким ошибкам не приведет.

Не везде. Под MinGW и VC++ при стандартных настройках да.
На Builder C++ поведение по умолчанию будет другое, программка просто упадет. Если запустить её же под отладчиком то начнет непрерывно кидать EZeroDivide. Сборка приложения с использованием vcl позволяет приложению отработать без сбоев, но в выводе будет Fine!
Собственно это и подвигло на посмотреть стандарт, а потом оформить в виде задачки.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Простая задачка :)
От: ilvi Россия  
Дата: 19.03.09 08:47
Оценка:
Здравствуйте, ilvi, Вы писали:

Под виндой похоже можно настроить, чтоб бросалось исключение и в MinGW и VC++. Для этого нужно выполнить вызов функции _control87 до деления. Другое дело, что это исключение try catch не поймает. В VC++ поможет __try __except. В MinGW незнаю, что поможет.

#include <float.h>

.....

_control87(0, _EM_ZERODIVIDE);
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Простая задачка :)
От: Sergey Chadov Россия  
Дата: 19.03.09 15:41
Оценка:
Здравствуйте, ilvi, Вы писали:

I>Здравствуйте, ilvi, Вы писали:


I>Под виндой похоже можно настроить, чтоб бросалось исключение и в MinGW и VC++. Для этого нужно выполнить вызов функции _control87 до деления. Другое дело, что это исключение try catch не поймает. В VC++ поможет __try __except. В MinGW незнаю, что поможет.


Ну если уж совсем точно, то для VС++ try catch поймает, если установлен ключ /EHa
--
Sergey Chadov

... << RSDN@Home 1.2.0 alpha rev. 685>>
Re: Простая задачка :)
От: Vamp Россия  
Дата: 19.03.09 17:39
Оценка:
Интересно, а если заменить переменные на константы, и предположить, что умный компилятор выполнет расчет в компайл-тайм, что он сделает?
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Простая задачка :)
От: ilvi Россия  
Дата: 20.03.09 04:48
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Интересно, а если заменить переменные на константы, и предположить, что умный компилятор выполнет расчет в компайл-тайм, что он сделает?


MinGW c -O3 своего поведения не изменил VC++ c /Ox тоже не изменил своего поведения.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Простая задачка :)
От: minorlogic Украина  
Дата: 22.03.09 07:49
Оценка:
Здравствуйте, ilvi, Вы писали:

I>Что выведет программа :


Сильно зависит от компилятора и опций компилятора.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Ищу работу, 3D, SLAM, computer graphics/vision.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.