В этом уроке напишем не самую простую программу на Си. Главная цель урока - попробовать написание программ с использованием основных типов данных.
Хорошим стилем будет в начале каждой программы и в наиболее сложных местах кода помещать комментарии. Многострочный комментарий помещается между символами /*
и */
. Строчный комментарий начинается символами //
- все содержимое до конца строки игнорируется компилятором.
/* Первая программа на Си. С комментариями */
Далее подключаются библиотеки и заголовочные файлы. Подключим стандартную библиотеку ввода вывода
Каждая программа на Си (как и на С++) должна содержать основную функция main(). Если эта функция возвращает значение, то перед ней указывается тип, если же функция ничего не возвращает, то вместо типа указывается void
. Логично, если главная функция будет возвращать целое значение, т.к. это значение указывает успешно или аварийно завершилось выполнение программы (значение переменной %errorlevel% в ОС Windows или $status в GNU/Linux). Успешно завершенная программа возвращает 0, аварийно завершенная программа - значение отличное от 0 (разные значение указывают на вид ошибки). Минимальная программа будет содержить следующий код:
int main(){ // Здесь код программы return 0; // успешное завершение }
Для того, чтобы понять работу статуса завершения (или кода завершения) создадим файл first.c
и запишем в него код примера. Далее компилируем, запускаем и проверяем возвращаемый статус завершения (GNU/Linux):
gcc first.c ./a.out echo $status
После третьей команды в консоль выведется значение 0. Если мы укажем в return
другое значение, то и после завершения работы программы результат переменной $status соответственно изменится. В ОС Windows для проверки используйте команду echo %errorlevel%
в командной оболочке. Отметим, что по такому принципу работают все стандартные команды. Например, если в команде перехода в каталог, вы укажите несуществующую папку, то изменится статус завершения команды на значение 1 (попробуйте команду cd qqq
, где qqq - имя несуществующего каталога).
Следующий код показывает работу с целыми числами и числами с плавающей точкой. Для описания пременной мы указываем тип данных, далее, через запятую, список переменных данного типа. В объявлении переменных мы можем сразу же присвоить значение. В Си нет необходимости описывать переменные начале программы - описание может происходить в любом месте программы перед использованием данной переменной. Все команды в Си разделяются символом точки с запятой. Повторяющиеся пробелы и переносы строк игнорируются. В примере объявляются целочисленные переменные a, b, c и переменная с плавающей точкой d. Для присваивания значения переменной используется символ "=", для арифметических операций: "+" (сложить), "-" (вычесть), "*" (умножить), "/" (разделить). Приоритет у операций умножение и деления выше, чем у сложения и вычитания.
int a = 1, b = 2, c; // Целочисленные переменные c = a + b; // c = 3 printf("c = %i\n", c); // Форматный вывод c = a / b; // Целочисленное деление c = 0 printf("c = %i\n", c); // Форматный вывод float d; d = a / b; // Целочисленное деление d = 0 printf("d = %.4f\n", d); // Форматный вывод d = (float) a / b; // Нецелочисленное деление printf("d = %.4f\n", d); // Форматный вывод
Чтобы избежать в дальнейшем головной боли запомните, что при делении целых чисел используется целочисленное деление. Поэтому c = a / b
и d = a / b
дает результат 0. Использование преобразования типов данных дает уже правильный результат d = (float) a / b
равный 0,5, т.к. переменная a преобразуется к числу с плавающей точкой.
Для вывода данных мы используем команду форматного вывода printf
. В качестве первого параметра указывается строка, содержащая спецификацию формата начинающуюся с символа процента. После идут параметры (переменные), которые последовательно подставляются согласно формату. Для целых чисел мы используем %i
, для фиксированного формата (числа с фиксированной точкой) %f
или %.xf
, где x - число значащих цифр после точки.
Для вещественных чисел с большей точностью, чем float
используется тип double
.
Для символьного типа используется тип char
. Об этом типе мы поговорим подробно в одном из следующих уроков. Пока пример для размышления:
char e = 'a'; printf("e = %c %c\n", e, 85); // Форматный вывод
В данном уроке мы изучили основные типы данных и научились форматному выводу значений переменных. В последующих урокам мы будем расширять наши знания о типах данных и видах форматного вывода.
В заключение приведем полный текст нашей программы. Это уже не привет, мир!.
/* Первая программа на Си. С комментариями */ #include// Стандартная библиотека ввода-вывода int main(){ // Здесь код программы int a = 1, b = 2, c; // Целочисленные переменные c = a + b; // c = 3 printf("c = %i\n", c); // Форматный вывод c = a / b; // Целочисленное деление c = 0 printf("c = %i\n", c); // Форматный вывод float d; d = a / b; // Целочисленное деление d = 0 printf("d = %.4f\n", d); // Форматный вывод d = (float) a / b; // Нецелочисленное деление d = 0.5 printf("d = %.4f\n", d); // Форматный вывод char e = 'a'; printf("e = %c %c\n", e, 85); // Форматный вывод return 0; // успешное завершение }