Зачем нужны суффиксы числовых литералов?

Предположим, я хочу инициализировать переменную:

float f = 1.0f;

Бесит меня здесь только f

Я понимаю, что изначально 1.0 предполагается как число типа double, но какая разница, если 1.0 все равно вписывается в float? Зачем нужны эти суффиксы, если без них все прекрасно работает? Разве не компилятор преобразовывает типы за меня?


Ответы (3 шт):

Автор решения: user7860670

Литералы позволяют задавать тип литералу или (для пользовательских литералов) производить какие-то его преобразования.

Например:

// инициализация:
unsigned long long value{35};
auto value{35llu};

// вызываем вторую перегрузку
void foo(int x);
void foo(unsigned long long x);

foo(static_cast< unsigned long long >(35));
foo(35llu);
→ Ссылка
Автор решения: wololo

Суффиксы нужны, чтобы явно указать тип литерала. Так как вещественное число 1 представимо точно типом float, то способ, которым вы его зададите не принципиален, результат будет одинаков:

float f1 = 1.0L;
float f2 = 1.0;
float f3 = 1.0f;
float f4 = 1;
float f5 = 1ULL;
float f6 = (char)1;
float f7 = true;

Но бывают и ситуации немного сложнее, где тип литерала напрямую влияет на конечный результат:

cout << std::sin(1.0 ) << endl; //8.41470984807896505e-01
cout << std::sin(1.0f) << endl; //8.41470956802368164e-01

float f = 0.1;
cout << (f == 0.1 ) << endl; //false
cout << (f == 0.1f) << endl; //true
    
long long ll_1 = 65535   * 65535; //(Для 32-битного int тут UB)
long long ll_2 = 65535LL * 65535LL;
cout << ll_1 << endl; //-131071
cout << ll_2 << endl; //4294836225
→ Ссылка
Автор решения: Mikhailo

И мое дополнение:

auto d = 1.0;
auto f = 1.0f;

Как вы понимаете, d будет иметь тип double, а f - тип float.

→ Ссылка