Без .f
число интерпретируется как целое число, поэтому 1/3
равно (int)1/(int)3
=> (int)0
вместо желаемого (float)0.333333
..f
говорит компилятору интерпретировать литерал как число с плавающей запятой типа float.Существуют и другие подобные конструкции, такие как, например, 0UL
, что означает (unsigned long)0
, тогда как простой 0
будет (int)0
.
.f
на самом деле два компонента, .
который указывает, что литерал является числом с плавающей запятой, а не целым числом, и суффикс f
, который сообщает компилятору, что литерал должен иметь тип float, а не двойной тип по умолчанию, используемый для литералов с плавающей запятой.
Отказ от ответственности;«приведенная конструкция», использованная в приведенном выше объяснении, не является действительным приведением, а просто способом указать тип литерала.
Если вы хотите знать все о литералах и суффиксах, которые вы можете использовать в нихВы можете прочитать стандарт C ++, ( 1997 черновик , C ++ 11 черновик , C ++ 14 черновик , C ++ 17 черновик) или, альтернативно, взгляните на приличный учебник, такой как Язык программирования С ++ * Страуструпа .
В качестве примера, в вашем примере (float)1/3
литералы 1
и 3
на самом деле являются целыми числами, но 1 сначала преобразуется в число с плавающей точкой, а затем 3 неявно преобразуется в число с плавающей точкой, потому что это правый операнд оператора с плавающей запятой.(Оператор с плавающей запятой, потому что его левый операнд с плавающей запятой.)