1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
1

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

24.04.2014, 22:00. Показов 2503. Ответов 8
Метки нет (Все метки)

Всем привет

Недавно начал изучать язык 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 и не мудрить???
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.04.2014, 22:00
Ответы с готовыми решениями:

Как определить тип переменной?
isdigit тока нашел. а как узнать char или int или есть типа is_array? конечно можно все...

Как определить тип переменной, ссылающейся на определённый класс? Нужен именно тип, а не ссылка на обьект!
interface HowDefineMyType { void info(); } class A implements HowDefineMyType { ...

Определить тип преобразования, найти его элементы
Здравствуйте. Помогите, пожалуйста, с задачей: Определить тип преобразования, найти его...

Выяснить тип и определить неподвижные точки изометрического преобразования
Задание дано в заголовке. Вот пример: \begin{pmatrix}x &amp; \\ y &amp; \end{pmatrix} \rightarrow...

8
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
24.04.2014, 22:17 2
Какой тип написал, тот и будет
C++
1
int sum;
1
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
24.04.2014, 22:18 3
dicros, а ты пробовал запустить данный пример?
Первое: ошибка символа в 7 строке, там знак деления перевёрнут.
Второе: чтоб увидеть результат надо задержать экран функцией getch(); (её написать перед return 0) и заголовочный файл #include <conio.h> для её работы. Ну русские символы я опущу - сам нагуглиш.

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

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

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

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

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


Может есть какие другие способы более универсальные и правильные?
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
25.04.2014, 00:29 5
dicros, тип данных естественно останется тем который заявлен, однако результат вычисления разный - это заставляет задуматься над способом приминения.

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

Пользуйся тем что работает, этого будет достаточно. Оптимизация будет когда она будет необходимо и когда придёт знание и толчок к постижению этого знания.
0
16466 / 8966 / 2198
Регистрация: 30.01.2014
Сообщений: 15,567
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.
1
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
25.04.2014, 00:51  [ТС] 7
Izual, дело в том что не хочется привыкать к неправильному написанию, вы то уже много этим занимаетесь и точно знаете какой из способов более универсальный и правильный и можете дать совет так сказать.



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

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

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



Арифметические операции, подобные + и *, действуют следующим образом: если их операнды имеют различные типы, то операнд с более "низким" типом будет преобразован к более "высокому" типу.
вот я и подумал раз у double приоритет выше может быть он влияет и на тот тип данных который за скобками.
0
16466 / 8966 / 2198
Регистрация: 30.01.2014
Сообщений: 15,567
25.04.2014, 00:58 8
Цитата Сообщение от dicros Посмотреть сообщение
вот я и подумал раз у double приоритет выше может быть он влияет и на тот тип данных который за скобками.
Он влияет на результат выражения. Т.е. если один из операндов double, то и результат тоже будет double.
1
Комп_Оратор)
Эксперт по математике/физике
8771 / 4510 / 608
Регистрация: 04.12.2011
Сообщений: 13,454
Записей в блоге: 16
25.04.2014, 01:22 9
Лучший ответ Сообщение было отмечено dicros как решение

Решение

Цитата Сообщение от 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. Но если не отключены соответствующие предупреждения, он предупредит о том, что преобразование может привести к потере информации.
3
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.04.2014, 01:22
Помогаю со студенческими работами здесь

Определить тип переменной
Помогите пожалуйста! не имею представления как сделать( Определить тип М перечислением месяцев,...

Определить тип переменной
Я сам себе придумал такую задачу, но что-то как решить её загуглить не удалось, просьба ответить...

Как определить тип переменной?
Доброго времени. В VB есть замечательная функция TypeName(), которая возвращает в строковом виде...

Как определить тип переменной?
Здравствуйте. Возможно не правильно поставил вопрос, но постараюсь объяснить. Имеется textBox1,...

Как определить тип переменной?
Как можно определить тип переменной? Раньше существовала функция TypeOf, function TypeOf(X:...

Определить тип переменной. Динамический анализ
Заранее прошу прощения если что то сделаю не так, это мое первое сообщение Мне нужно определить...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru