Почему вы не можете использовать литерал 'f' сразу после целого числа? - PullRequest
0 голосов
/ 29 марта 2020

Я пишу код на C ++. То, что я нашел «странным», это то, что вы не можете использовать 3f, поскольку Visual Studio выдает ошибку «буквальный оператор не найден», и вы можете использовать только 3.f.

Почему вы не можете просто использовать литерал 'f' непосредственно после числа без разделителя точек (3f)?

Ответы [ 2 ]

5 голосов
/ 29 марта 2020

Вот правила из стандарта :

floating-point-literal:
    decimal-floating-point-literal
    hexadecimal-floating-point-literal

decimal-floating-point-literal:
    fractional-constant exponent-part-opt floating-point-suffix-opt
    digit-sequence exponent-part floating-point-suffix-opt

fractional-constant:
    digit-sequence-opt . digit-sequence
    digit-sequence .

exponent-part:
    e sign-opt digit-sequence
    E sign-opt digit-sequence

floating-point-suffix: one of
    f  l  F  L

Как видите, . всегда должен быть включен в десятичную константу с плавающей запятой, если есть часть экспоненты отсутствует.

В книге K & R это объясняется следующим образом:

Константы с плавающей запятой содержат десятичную точку (123,4) или экспоненту (1e-2) или оба; их тип двойной, если не суффикс. Суффиксы f или F указывают на константу с плавающей точкой; l или L означают длинный дубль.

Итак, предполагается, что f или l изменяет уже константу с плавающей точкой (double), чтобы иметь тип float или long double. Сам суффикс не делает константу без плавающей точки постоянной константой с плавающей точкой.

2 голосов
/ 30 марта 2020

Почему вы не можете использовать литерал 'f' сразу после целого числа?

Если f суффикс был разрешен после текста, образующего целое число, чтобы стать с плавающей запятой проблема может возникнуть с шестнадцатеричными целыми числами / с плавающей запятой

0x1.23f  // this is a float
0x1p23f  // this is a float
0x123f   // If this now a float?  No, it remains an integer.

Суффикс f меняет тип литерала с плавающей запятой по умолчанию на double. Это не делает его литералом с плавающей точкой.

...