Я считаю, что это анти-паттерн . Это говорит о том, что программист не совсем знал, что он делает, что немедленно бросает остальную часть кода в сомнительный свет.
Конечно, это не (цитируя Википедию) "неэффективно", но я нахожу это "далеко не оптимальным". Он ничего не стоит во время выполнения, но он загромождает код ненужным мусором, все время сигнализируя, что кто-то посчитал это необходимым.
Также обратите внимание, что выражение не анализируется как вызов функции: sizeof
не является функцией. Вы не вызываете функцию, передающую магический символ char
. Вы применяете встроенный унарный префиксный оператор sizeof
к выражению, и ваше выражение в данном случае является приведением к типу char
, который в C записывается как (char)
.
Вполне возможно, и настоятельно рекомендуется, когда это возможно, использовать sizeof
в других выражениях, тогда он даст размер значения выражения:
char a;
printf("A char's size is %u\n", (unsigned int) sizeof a);
Это будет печатать 1
, всегда, на всех соответствующих реализациях C.
Я также полностью согласен с Дэвидом Курнапо и считаю, что повторение типа name при malloc()
-all также будет своего рода анти-паттерном.
вместо
char *str;
str = malloc(N * sizeof (char));
, что многие пишут для выделения строкового буфера с N-символьной емкостью, я бы сказал
char *str;
str = malloc(N * sizeof *str);
Или (только для строк) пропустите sizeof
, как указано выше, но это, конечно, более общий подход и работает так же хорошо для любого типа указателя.