Альтернативный метод для типизации в C? - PullRequest
1 голос
/ 14 февраля 2009

Я наткнулся на эту строку в каком-то коде и не могу найти синтаксис, определенный где-либо:

*(float *)csCoord.nX = lImportHeight* .04f; /* magic number to scale font size */

Если я удаляю f из .04f , то компилятор выдает предупреждение о возможной потере данных из-за преобразования из 'double' в 'float'. Я предполагаю, что f выполняет какое-то типирование.

Кто-нибудь видел это раньше? Где это определено в стандарте C?

Ответы [ 4 ]

10 голосов
/ 14 февраля 2009

Завершающий f указывает компилятору, что это литерал типа с плавающей запятой, точно так же, как "" обозначает буквальную строку, а суффикс L указывает на длинный int.

Спецификация C ++ для литералов такая же.

2 голосов
/ 14 февраля 2009

Без «f» количество 0,04 является двойным. Когда вы умножаете lImportHeight на двойной, вы получаете еще один двойной. Затем вы сохраняете его в памяти с плавающей запятой, теряя точность. С "f" 0.04f является литералом с плавающей точкой. Вы умножаете lImportHeight на него и получаете плавающее число; тогда присвоение не приводит к потере точности.

0 голосов
/ 14 февраля 2009

В чем именно проблема? Ваш компилятор захлебывается .04f? Попробуйте

(float) .04
0 голосов
/ 14 февраля 2009

Не знаю, где это определено в стандарте, но вы используете f для указания числа с плавающей запятой, в противном случае компилятор предполагает, что это двойное число. Точно так же вы можете указать целое число без знака, добавив u или long на l (строчные буквы) и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...