Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2011, 18:41   #1
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
Вопрос Касты и обычное приведение типов

Вот есть такой кусок кода:
Код:
for ( register int i = 0 ; i < 100 ; i++ )
{
       arr[i] = static_cast<double>(100 / (i+1) );
}
И такой:
Код:
for ( register int i = 0 ; i < 100 ; i++ )
{ 
       arr[i] = (double)100 / (i+1);
}
И такой:
Код:
for ( register int i = 0 ; i < 100 ; i++ )
{
       arr[i] = static_cast<double>(100) / (i+1) ;
}
Вроде бы одно и тоже(вроде бы ), но результаты получаются разные. Почему?

P.S. Юзаю Visual C++ Express 2010.

Последний раз редактировалось _-Re@l-_; 26.11.2011 в 18:47.
_-Re@l-_ вне форума Ответить с цитированием
Старый 26.11.2011, 19:03   #2
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию

Могу ошибаться, но вроде как разный приоритет операций, поэтому последовательность операций другая, как итог и результат.
L6go1as вне форума Ответить с цитированием
Старый 26.11.2011, 19:05   #3
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

В первом примере сначала делишь int на int- получаешь int, а потом приводишь к double. Во втором и третьем сначала приводишь к double, а потом делишь на int.
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 26.11.2011, 19:06   #4
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Ну, с первым случаем я разобрался, там просто целочисленный результат приводится к вещественному.
А вот второй и третий - да, там приоритет такой какой надо, и результат там совпадает.

Sam Gold
Да, спасибо.
_-Re@l-_ вне форума Ответить с цитированием
Старый 27.11.2011, 06:13   #5
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Вот есть такой кусок кода:
Код:
for ( register int i = 0 ; i < 100 ; i++ )
{
       arr[i] = static_cast<double>(100 / (i+1) );
}
И такой:
Код:
for ( register int i = 0 ; i < 100 ; i++ )
{ 
       arr[i] = (double)100 / (i+1);
}
И такой:
Код:
for ( register int i = 0 ; i < 100 ; i++ )
{
       arr[i] = static_cast<double>(100) / (i+1) ;
}
Вроде бы одно и тоже(вроде бы ), но результаты получаются разные. Почему?

P.S. Юзаю Visual C++ Express 2010.
У вас во втором и третьем случае результат должен быть одним и тем же. В первом случае у вас результат отличается от двух последних, так как вы сначала вычисляете выражение с помощью целочисленной арифметики, то есть дробные части у вас просто отбрасываются, а затем конечный результат приводите к типу double.
В последних двух вариантах, когда вы число 100 привели к типу double, то и все остальные операнды выражения переводятся в тип double, так как ранг ( это термин из стандарта С) double выше, чем ранг int. Но проще было вообще не использовать приведение типов, а нписать выражение следующим образом

arr[i] = 100.0 / (i+1) ;

Так как константа 100.0 имеет тип double, то и другие операнды будут преобразованы в тип double
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
приведение типов??? nikozavr C# (си шарп) 1 14.05.2011 22:29
NetUserAdd() приведение типов disaer Общие вопросы C/C++ 2 12.05.2011 08:09
Приведение пользовательских типов peplenko Общие вопросы C/C++ 6 18.04.2011 12:59
С - приведение типов onewho Общие вопросы C/C++ 3 21.11.2010 00:12
Приведение типов в Qt mike_tihomirov Qt и кроссплатформенное программирование С/С++ 1 19.06.2010 13:14