Зачем нужны суффиксы числовых литералов?
Предположим, я хочу инициализировать переменную:
float f = 1.0f;
Бесит меня здесь только f
Я понимаю, что изначально 1.0 предполагается как число типа double, но какая разница, если 1.0 все равно вписывается в float? Зачем нужны эти суффиксы, если без них все прекрасно работает? Разве не компилятор преобразовывает типы за меня?
Ответы (3 шт):
Литералы позволяют задавать тип литералу или (для пользовательских литералов) производить какие-то его преобразования.
Например:
// инициализация:
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);
Суффиксы нужны, чтобы явно указать тип литерала. Так как вещественное число 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
И мое дополнение:
auto d = 1.0;
auto f = 1.0f;
Как вы понимаете, d будет иметь тип double, а f - тип float.