Форум программистов, компьютерный форум CyberForum.ru

Преобразования типов. Определить тип переменной - C++

Восстановить пароль Регистрация
 
dicros
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 63
24.04.2014, 22:00     Преобразования типов. Определить тип переменной #1
Всем привет

Недавно начал изучать язык C++ по книжке "Объектно-ориентированное программирование в C++" и там есть тема (Преобразование типов) вот пример из этой темы:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
int main()
{
  int intVar=1500000000;
  intVar=(intVar*10)\10;
  
  cout << "Значение intVar равно " << intVar << endl;
 
  intVar=1500000000;
  intVar=(static_cast<double>(intVar)*10)/10;
 
  cout << "Значение intVar равно " << intVar << endl;
 
return 0;
}

Если допустим я запишу вот так......

int var1=10;
int sum=static_cast<double>(var1)*10;

В результате у переменной sum какой тип данных будет?? int или double.

И второй вопрос есть ли смысл от этого преобразование "как в примере из книжке" если можно сразу у этой переменной объявить тип double и не мудрить???
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2014, 22:00     Преобразования типов. Определить тип переменной
Посмотрите здесь:

C++ Как Определить тип переменной?
Преобразования типов C++
Преобразования типов C++
Преобразования типов C++
Преобразования типов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
24.04.2014, 22:17     Преобразования типов. Определить тип переменной #2
Какой тип написал, тот и будет
C++
1
int sum;
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
24.04.2014, 22:18     Преобразования типов. Определить тип переменной #3
dicros, а ты пробовал запустить данный пример?
Первое: ошибка символа в 7 строке, там знак деления перевёрнут.
Второе: чтоб увидеть результат надо задержать экран функцией getch(); (её написать перед return 0) и заголовочный файл #include <conio.h> для её работы. Ну русские символы я опущу - сам нагуглиш.

Результат выполнения: в первой строке будет число "211509811", а во второй та цифра которая была указана.
В общем то не по теме, но я ответа не знаю по поводу данного вопроса, как то не пользовался..
dicros
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 63
24.04.2014, 22:41  [ТС]     Преобразования типов. Определить тип переменной #4
villu, спасибо буду знать теперь.

Izual, пример запускать пробовал раньше, а щас только для примера переписал поэтому на ошибку не обращай внимания.

Хорошо что ты напомнил про задержку и про русский язык. Скажите пожалуйста каким образом это все лучше реализовать???

Я делаю вот так

setlocale(0, "Rus"); //Это для поддержки русского языка
system("pause"); // Для задержки


Может есть какие другие способы более универсальные и правильные?
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
25.04.2014, 00:29     Преобразования типов. Определить тип переменной #5
dicros, тип данных естественно останется тем который заявлен, однако результат вычисления разный - это заставляет задуматься над способом приминения.

Цитата Сообщение от dicros Посмотреть сообщение
лучше реализовать
Для чего лучше?.. Не забегайте в перёд, всему своё время, придёт время и если это нужно будет, то оно проявит себя. (аналогия с пословицей: "Если гора не идёт к Магомеду, Магомед идёт к горе")

Пользуйся тем что работает, этого будет достаточно. Оптимизация будет когда она будет необходимо и когда придёт знание и толчок к постижению этого знания.
DrOffset
6461 / 3835 / 885
Регистрация: 30.01.2014
Сообщений: 6,630
25.04.2014, 00:40     Преобразования типов. Определить тип переменной #6
Цитата Сообщение от dicros Посмотреть сообщение
В результате у переменной sum какой тип данных будет?? int или double.
Результат выражения будет double. Потом будет автоматическое преобразование к int, обрезка дробной части. В переменной sum будет целое число.
Если взять более интересный пример,
C++
1
2
int var1=10;
int sum = static_cast<double>(var1)*0.01;
в sum будет 0.
dicros
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 63
25.04.2014, 00:51  [ТС]     Преобразования типов. Определить тип переменной #7
Izual, дело в том что не хочется привыкать к неправильному написанию, вы то уже много этим занимаетесь и точно знаете какой из способов более универсальный и правильный и можете дать совет так сказать.



DrOffset, да спасибо я уже понял, просто когда читал меня смутили вот эти строки из книжки

Давайте рассмотрим действия компилятора, когда он встречает выражения со смешанными типами. Каждый тип данных можно условно считать "ниже" или "выше" по отношению к другим типам. Иерархия типов данных приведена ниже:

long double высший
double
float
long
int
short
char низший



Арифметические операции, подобные + и *, действуют следующим образом: если их операнды имеют различные типы, то операнд с более "низким" типом будет преобразован к более "высокому" типу.
вот я и подумал раз у double приоритет выше может быть он влияет и на тот тип данных который за скобками.
DrOffset
6461 / 3835 / 885
Регистрация: 30.01.2014
Сообщений: 6,630
25.04.2014, 00:58     Преобразования типов. Определить тип переменной #8
Цитата Сообщение от dicros Посмотреть сообщение
вот я и подумал раз у double приоритет выше может быть он влияет и на тот тип данных который за скобками.
Он влияет на результат выражения. Т.е. если один из операндов double, то и результат тоже будет double.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2014, 01:22     Преобразования типов. Определить тип переменной
Еще ссылки по теме:

C++ преобразования типов
Определить тип передаваемой в функцию переменной C++
Определить тип переменной. Динамический анализ C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,722
Записей в блоге: 3
25.04.2014, 01:22     Преобразования типов. Определить тип переменной #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от dicros Посмотреть сообщение
вот я и подумал раз у double приоритет выше может быть он влияет и на тот тип данных который за скобками.
double шире. То есть, расширительное преобразование приведёт к тому, что целое участвующее в арифметической операции с double, будет автоматически (неявно) преобразовано к double. Это значит, что:
C++
1
2
3
int a=5;
int b=6;
double c = (double)a + b;
переменная a будет явно преобразована к double, а переменная b будет преобразована к double неявно. То есть, за скобками будет преобразование тоже. Это потому, что операция сложения "+" определена только для одинаковых встроенных типов. А поскольку, заботясь о сохранении точности, компилятор проводит расширительное преобразование, то он и вынужден сделать именно так. Но в ваших примерах в левой части int, поэтому сначала операнды правой части будут преобразованы к double и результат выражения справа будет double, но при присвоении переменной левой части произойдет обратное преобразование (сужающее) double к int. Компилятор вынужден это сделать, так как ожидается int. Но если не отключены соответствующие предупреждения, он предупредит о том, что преобразование может привести к потере информации.
Yandex
Объявления
25.04.2014, 01:22     Преобразования типов. Определить тип переменной
Ответ Создать тему
Опции темы

Текущее время: 15:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru