@Xproz
Пытаюсь постигнуть компьютерные сети

Нужно ли писать суффиксы литералов?

#include <stdio.h>

int main(void)
{
	float a = 1.0f;
	float b = 1.0;
	return 0;
}


Литералы с плавающей точкой по умолчанию реализуются как double, однако если подписать к нему суффикс f/F, то он уже реализуется как float.
Это все понятно. Однако с точки зрения оптимизации, эстетики и/или стандартов, как писать все-таки лучше? Ведь в данном случае на результат значения, которое присваивается переменной, это никак не влияет, и, насколько я понял, в примере выше компилятор в обоих случаях делает приведение типа из double в float: в первом случае переводит 1.0 в float на этапе считывания литерала, а во втором случае во время присваивания значения 1.0 в переменную.

Тоже самое касается и для выражений типа:
unsigned int a = 10u;
unsigned long int b = 10ul;
long double c = 12.0l;

и т.д.
  • Вопрос задан
  • 213 просмотров
Пригласить эксперта
Ответы на вопрос 4
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
При инициализации переменных это обычно не используют. Ну, происходит тут преобразование типа - ошибки быть не может. Это лишь немного снижает читабельность кода и все.

Вот когда вы константы передаете в какие-то перегруженные функции, где имеет значение unsigned ли ей передан или signed, или есть разница между float и double, то тогда - да, надо писать.
Ответ написан
@res2001
Developer, ex-admin
Однако с точки зрения оптимизации, эстетики и/или стандартов, как писать все-таки лучше

Как хотите.

На самом деле опциями компилятора можно задать выдавать предупреждения (или даже ошибку) на подобное не явное приведение типов. Тогда это будет "не красиво" или даже вообще ошибка компиляции, и тут вам придется исправлять ситуацию добавив суффикс.
Но подобные опции используют не часто. На сколько помню для gcc это опции -Wsign-conversion и/или -Wconversion но могу ошибаться. И, по моему, они даже не включаются через -Wall -Wextra -pedantic - обычно используют этот набор опций, когда хотят заставить компилятор выполнять больше проверок кода.
Немного модифицировав опции можно добиться не предупреждения, а ошибки.

Если вы пишите исполняемый файл, то вы контролируете опции сборки в makefile (или чем вы там пользуетесь) и вас этот вопрос может не парить вообще.
Если вы пишете библиотеку, которую распространяете в исходниках, то есть вероятность, что пользователь при сборке захочет добавить своих опций и тогда ошибки/предупреждения могут проявится. Можете расставить суффиксы для обхода потенциальных проблем, а можете забить и оставить на усмотрение конечного пользователя библиотеки.
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Во всех случаях мы описали тип слева. Тоесть задача типизации - выполнена.
float a = 1.0f;
unsigned int a = 10u;

Я думаю что ничего дополнительно указывать не надо. В противном случае у code-reviewer
это вызывает удивление и очередной WTF. Тоесть вам придется объяснять своему коллеге
ДЛЯ ЧЕГО вы ввели в исходные код дополнительную информацию.

Нужно писать так чтобы у коллег к вашему коду вообще не возникало вопросов.
Ответ написан
Комментировать
GavriKos
@GavriKos
У вас сильно простые примеры.
Если это где то внутри сложной формулы - то лучше явно задать тип, чтобы вызывался соответствующий оператор.

А если еще и перегрузка операторов используется - то вообще без вариантов.
В общем тут дело не в эстетике, а в логике кода. Т.е. есть ситуации когда НУЖНО задавать явно
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы