![]() |
|
Модераторы: bsa |
![]()
|
|
| hoz |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 27.6.2013 Репутация: нет Всего: нет |
Читаю книгу. Написано:
Файл math.h содержит информацию, которая даёт указание компилятору преобразовать величину year во временное представление double перед вызовом функции. Вот участок кода к этой ситуации:
Неужели любая из библиотечных функции способна так легко произвольно и без запроса на это изменять типы переменных пользовательских функции ? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
есть набор правил преобразований как для стандартных типов , так и для пользовательских.. и при приведении используйутся только эти правила и никакого фривольства )) |
|||
|
||||
| hoz |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 27.6.2013 Репутация: нет Всего: нет |
Хм. Ну и как начинающему программисту или вообще программисту об этом узнать? Где смотреть? Я что-то вот чаще задаюсь вопросом, что нужно для тех или иных задач учитывать... Вот тут, например, казалось бы, возводи pow-функция в степень заданный операнд, ан нет.. оно ещё и приводит к типу. Это же лишняя операция, которая может быть не нужна в определённое время! Зачему? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
в какой нибудь книжке, например в этой (первая по гуглу) http://www.lib.ru/CPPHB/cppref.txt , R.4 и подпункты.. Добавлено через 4 минуты и 55 секунд помимо стандартных есть еще пользовательские преобразования.. |
|||
|
||||
| hoz |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 27.6.2013 Репутация: нет Всего: нет |
Вот потому у меня и назрел вопрос. Ведь с пользовательскими всё понятно. Так сказать, преобразование по требованию. А стандартные - преобразование, которое не требуется иной раз, а оно происходит. Это как нежданные гости, которых не ждёшь, а они пришли типа.. Прочту Страуструпа, подумаю. Надеюсь, там будет ответ на мой вопрос. А то изучать дальше, не поняв того, что щяс не понятно, не логично. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 4 Всего: 49 |
Происходит оно только в том случае, если требуется. А в целом ответ на вопрос - язык так устроен. Если неявные преобразования типов хочется исключить, надо использовать что-то другое, например, Аду. |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Господа, ваши ответы абсолютно точны, конечно, но
мне кажецца, вы не приняли нужный градус понимания новичка. hoz, переменная year не меняет типа. Она как была у вас int (или что там), так и останецца int Никто ей тип не меняет! Это сообщение отредактировал(а) volatile - 14.7.2013, 12:04 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
hoz, тип переменной в языках С/С++ изменить в режиме исполнения нельзя. Другое дело, что компилятор может менять тип значения переменной. Чтобы не путаться в стандарте языка есть специальные обозначения для этого: rvalue (от right value, есть еще lvalue - left value). Смысл такой, что представим себе простейшую операцию: x = y; Здесь x - lvalue (находится слева), а y - rvalue (находится справа от оператора присваивания). В чем их отличия? Они отличаются тем, что y может быть не только другой переменной, но и сложным выражением, результат которого не хранится ни в одной из переменных, участвующих в выражении. Таким образом, на это выражение накладывается ряд ограничений. В частности, невозможно взять его адрес и присвоить "временной переменной" значение...
Когда ты вызываешь функцию, принимающую параметр типа X, а передаешь значение типа Y, то компилятор пытается сделать преобразование Y -> X или вызвать конструктор X(Y) (для невстроенных типов). Если это возможно, то создается временная переменная (rvalue) типа X и уже она передается в функцию. |
|||
|
||||
| hoz |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 27.6.2013 Репутация: нет Всего: нет |
bsa, как я понял, компилятор проводит операции только с переменными одного типа. И что бы провести операцию в том случает, которые я привёл выше, нужно было создать временную переменную переменной year типа double, так?
Как я понял, это, как раз-таки, и будет неявным преобразованием? Ну и по логике, неявное преобразование будет всегда производится в сторону большей точности, как написал Страуструп. Вроде как только для переменных чисел такое подходит, например, long duoble в double, а double в int. Я верно понимаю? |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
hoz, преобразования производятся в обе стороны. Но при понижении точности выдается предупреждение.
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |