Я новичок в программировании на C. Я слежу за книгой «Язык программирования C, второе издание». По мере продвижения я вношу свои собственные модификации в пример кода, представленный в книге. В любом случае я размещаю здесь свой код для проверки, потому что хочу убедиться, что у меня хороший старт. В частности, есть несколько вещей, в которых я хочу убедиться, что делаю правильно, чтобы не развить в будущем никаких вредных привычек:
Я хотел бы убедиться, что соблюдаю стандарты C. Основываясь на моем исследовании, я обнаружил, что текущий и самый последний стандарт для C — C17 или ISO / IEC 9899: 2018, поправьте меня, если я ошибаюсь. В результате я скомпилировал код со следующими параметрами:
gcc -Wall -pedantic-errors -std=c17 source.c
Это хорошая практика?Я знаю, что я новичок, но хочу убедиться, что даже самые простые вещи делаю чисто и эффективно.
Так что, если я смогу получить обзор этого образца кода, это будет здорово.
/* This program uses the formula C = (5/9)(F-32) to print a table of Farenheit
* temperatures and their Centigrade or Celsius equivalents. Adapted from:
* Kernighan, B. W., & Ritchie, D. M. (1988). The C programming language. */
#include <stdio.h>
/* Print Fahrenheit-Celsius table for Fahrenheit = 0, 20, ..., 300. */
int main(void)
{
float fahr, celsius;
int lower, upper, step;
lower = 0; /* Lower limit of temperature table. */
upper = 300; /* Upper limit. */
step = 20; /* Step size. */
printf("Fahrenheit to Celsiusn"); /* Table header */
printf("%3s %6sn", "F", "C"); /* Temperature label */
fahr = lower;
while (fahr <= upper) {
celsius = (5.0/9.0) * (fahr-32.0);
printf("%3.0f %6.1fn", fahr, celsius);
fahr = fahr + step;
}
}
1 ответ
Я хочу убедиться, что у меня хороший старт.
float
против double
Сохранить float
в случаях, когда требуется серьезное сокращение памяти или когда производительность вынуждает использовать узкую плавающую точку, иначе используйте double
как переходный тип с плавающей запятой.
Единицы измерения
300 что?
Физические единицы заслуживают ясности, возможно, комментария в коде. Будьте ясны или ой!.
// upper = 300; /* Upper limit. */
upper = 300 /* F */; /* Upper limit. */
убедитесь, что я придерживаюсь стандартов C.
Предупреждения
Использование современного компилятора со многими, если не всеми, предупреждениями — это хороший предмет. Может быть, добавить -Wetra
.
убедитесь, что я делаю даже самые простые вещи чисто и эффективно.
В общем и целом
Код выглядит очень чистым и в основном эффективным.
Ненужные смешанные операции FP
Уведомление с помощью float
объекты, пока double
константы, код выглядит так, как показано ниже, с повышающими и понижающими преобразованиями FP.
celsius = (float)((5.0/9.0) * ((double)fahr-32.0));
printf("%3.0f %6.1fn", (double)fahr, (double)celsius);
Если вы хотите остаться с float
, использовать float
константы
celsius = (5.0f/9.0f) * (fahr-32.0f);
Идея: абстрактное форматирование
#define F_WIDTH1 3
#define C_WIDTH2 6
printf("%*s %*sn", F_WIDTH, "F", C_WIDTH, "C");
...
printf("%*.0f %*.1fn", F_WIDTH, fahr, C_WIDTH, celsius);
Большое спасибо. Я обязательно буду реализовывать и изучать ваши предложения. Я понимаю предложение float vs double, но мне нужно провести дальнейшее исследование абстрактного форматирования, поскольку я еще не знаком с этим.
— дребрб