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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2011, 20:07   #1
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
Вопрос Вопрос по printf

Собственно, возник вопрос: почему работает следующий код:
Код:
#include <cstdio>

using namespace std;


int main()
{
	printf("%f %lf %Lf", 2.3, 2.3L, 2.3f);

	return 0;
}
Если я не ошибаюсь, %f означает float, %lf означает double, %Lf означает long double; и аргументы в данном вызове не соответствуют ожидаемым, число float в памяти представляется совсем иначе, чем double, даже выравнивание не должно бы спасти этого кода. Тем не менее вывод верен. В чем секрет? MSVS2008, Windows 7.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 10.09.2011, 20:50   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

предпололагаю, что связано это с такой фичей С++ как type promotion.
все аргументы вашего примера передаются в функцию как double. ну, а потом фукция пытается провести преобразование над double согласно формату, который вы прописали.
f.hump вне форума Ответить с цитированием
Старый 10.09.2011, 21:07   #3
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
все аргументы вашего примера передаются в функцию как double
Я не уверен, что это так, ведь printf принимает неопределенное количество аргументов (что специфицировано с помощью многоточия), следовательно никакого преобразования типов быть не может.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 10.09.2011, 21:24   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

однако может быть проверка типов на соответствие заданым аргументам, все таки это встроенная функция.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.09.2011, 22:01   #5
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Пепел Феникса, то есть просто надстройка компилятора?
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 11.09.2011, 21:35   #6
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Some other variants?
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 11.09.2011, 23:20   #7
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Syuf Посмотреть сообщение
Я не уверен, что это так, ведь printf принимает неопределенное количество аргументов (что специфицировано с помощью многоточия), следовательно никакого преобразования типов быть не может.
Тем не менее, оно происходит. C++ преобразует float в double (также как и char, short, wchar_t, bool... в int), а тип long double в MSVS представлен типом double (то есть бинарно они одинаковы) и потому 2.3L тоже интерпретируется как double.
http://en.wikipedia.org/wiki/Type_co...Type_promotion
netrino вне форума Ответить с цитированием
Старый 12.09.2011, 22:22   #8
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

netrino, то есть в функцию передается double и внутри нее нет ни одного намека на то что этот аргумент был float? Т.е. аргумент float через многоточие передать невозможно?
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 13.09.2011, 00:06   #9
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

возможно, зависит от компилятора.

хотите узнать как оно на самом деле прогоните ваш printf в дизасемблере, посмотрите какими кусками процедура снимает данные со стека, или регистров, или оттуда где они лежат, и что потом с этими данными происходит.
f.hump вне форума Ответить с цитированием
Старый 13.09.2011, 20:32   #10
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
хотите узнать как оно на самом деле прогоните ваш printf в дизасемблере, посмотрите какими кусками процедура снимает данные со стека, или регистров, или оттуда где они лежат, и что потом с этими данными происходит.
Хочу, но не так сильно. В общем, спасибо всем за ответы.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
printf stenl1 Общие вопросы C/C++ 8 03.01.2011 12:26
Вопрос про фунцию printf() Anateron Общие вопросы C/C++ 12 12.03.2010 16:00
Ошибка в функцие printf Sarumjan PHP 5 26.02.2010 11:33
printf zmey31313 Помощь студентам 4 13.01.2010 18:29
unicode и printf Legat Общие вопросы C/C++ 9 06.07.2008 13:41