Быстрый обзор основных конструкций языка C для тех, кто хочет разобраться в основах. Здесь вы встретите много очевидных и понятных конструкций, которые есть во многих языках, — это потому, что многие языки взяли эти конструкции как раз из языка C.
На самом деле в статье их 11, но 10 звучит лучше.
👉 Точка с запятой ставится после каждой команды.
Комментарии
Классические комментарии в C выглядят так:
/* Привет, это комментарий */
/* Его можно начинать на одной строчке
и продолжать на другой */
Есть ещё однострочные комментарии двумя слешами //, но бывают компиляторы, которые их не понимают.
Переменные и типы данных
Чтобы объявить переменную в C, нужно сначала указать её тип, а потом написать имя. Отдельного служебного слова для создания переменной в C нет.
В C есть разделение на короткие (short), обычные и длинные (long) переменные — на 2, 4 и 8 байт соответственно. Это нужно для экономии памяти, чтобы выделять ровно то количество байт, которое нужно для работы программы.
int i; /* целое число на 4 байта */
int x,y; /* две целочисленные переменные */
short int si; / *короткое целое число на 2 байта */
long int l; /* целое число на 8 байт */
char c; /* символьная переменная */
float f; /* дробная переменная на 4 байта */
double d; /* дробная переменная на 8 байт */
int a [10]; /* массив из 10 целых чисел */
struct {int i; char c;} str_name; /* структура из целого числа и символа */
Внешние файлы и директивы
Чтобы программа получила некоторые дополнительные возможности, которых нет в коде по умолчанию, используют директивы. Они обычно пишутся в начале программы и начинаются с символа решётки:
/* компилятор ищет файл prog.h в каталоге /usr/include и позволяет нам использовать команды из этого файла */
#include <prog.h>
#ifdef i8088
/* если программа будет запущена на процессоре 8088, то выполнятся инструкции, написанные внутри этого блока */
#endif
Формат программы
В каждой программе на C должна быть функция main(), внутри которой размещается основной код. Большинство компиляторов требуют, чтобы мы указали тип этой функции — обычно можно использовать int (целочисленный) или void (пустой). Все остальные функции добавляются по желанию, но main() должна быть всегда.
#include <prog.h>
/* основная функция */
void main() {
/* содержимое функции */
}
Ввод и вывод
Для вывода используется команда printf():
/* подключаем библиотеку расширенного ввода-вывода */
#include <stdio.h>
/* основная функция */
void main() {
/* объявляем целочисленную переменную */
int x;
/* выводим только строку /*
printf("Введите число: ");
/* вводим число */
cin >> x;
/* выводим строку и переменную */
/* u означает, что переменную нужно вывести как целое десятичное число без знака */
printf("Вы ввели %u", x);
}
Если нужен ввод данных, то используют команду scanf():
/* подключаем библиотеку расширенного ввода-вывода */
#include <stdio.h>
/* основная функция */
void main() {
/* объявляем переменные */
int h,m;
/* выводим только строку /*
printf("Введите время в формате чч:мм ");
/* вводим время */
/* d означает, что мы ждём целое десятичное число */
scanf("%d:%d", &h, &m);
}
Присваивание и сравнение
C использует классический подход:
один символ «равно» — присваивание
два символа «равно» — сравнение
Остальные операторы сравнения и логические операторы такие же, как и в других языках. Каждое сравнение берётся в скобки.
Условный оператор if
Тоже всё стандартно (потому что C во многом этот стандарт и создал):
if (условие) {
/* если условие верно, делаем что-то */
} else {
/* если условие неверно, делаем что-то другое */
}
#include<stdio.h>
void main() {
int pass;
prinf("Введите пароль: ");
scanf("%d", &pass);
/* если ввели число 1234 */
if (pass == 1234) {
printf("Вход разрешён");
/* если ввели что-то другое */
} else {
prinf("Вы ввели неверный пароль");
}
}
Если блок с else не нужен, его можно не писать — короткий if тоже работает.
Оператор множественного выбора switch
Чтобы не плодить множество операторов if, когда нужно выбрать одно из нескольких значений, используют оператор switch:
#include<stdio.h>
int main() {
short int day;
printf("Введите номер дня недели");
scanf("%d", &day);
/* если номер больше семи — берём целочисленный остаток от деления номера на 7 */
if (day > 7) {
day = day % 7;
}
/* выбираем день из вариантов ниже */
switch (day) {
/* если день равен 0 */
case 1:
printf("Понедельник");
/* выходим из дальнейших проверок */
break;
case 2:
printf("Вторник");
break;
case 3:
printf("Среда");
break;
case 4:
printf("Четверг");
break;
case 5:
printf("Пятница");
break;
case 6:
printf("Суббота");
break;
/* если ни один вариант не подошёл */,
default:
printf("Воскресенье");
}
}
Если не ставить команду break, то оператор будет продолжать выполнять остальные проверки, даже если найдёт совпадение по условию.
Цикл с предусловием for
Классический цикл, который в таком же виде используется во многих языках:
int i;
/* перебираем все числа от 1 до 100, увеличивая переменную на 1 на каждом шаге цикла */
for (i = 1; i < 101; i++) {
/* выводим значения их квадратов */
printf("%d ", i*i);
}
Особенность этого цикла в C в том, что он может работать и с дробными числами, например, увеличивать счётчик каждый раз на 0,1:
/* дробное число */
float num;
/* идём от 5 до 0 и каждый раз уменьшаем число на 0,1 */
for (num = 5.0f; num > 0f; num -= 0.1) {
/* выводим результат */
printf("%.2f ", num);
}
Циклы while и do-while
Если вы заранее не знаете, сколько раз будет выполняться цикл, используйте while или do-while. Первый проверяет условия до начала цикла (и если там истина — выполняет его), а второй делает проверку в самом конце.
/* объявляем переменную и сразу присваиваем ей значение */
int i = 0;
/* пока i меньше 10 – цикл работает */
while (i < 10) {
printf("%d\n", i);
/* обрабатываем переменную цикла */
i++;
}
/* сделаем то же самое, но с постусловием */
i = 0;
/* сначала заходим в цикл */
do {
printf("%d\n", i);
i++;
/* а в конце проверяем, идём на новый повтор или нет */
} while(i < 10);
В отличие от цикла for здесь программист сам должен следить за тем, чтобы цикл когда-нибудь прекратился. Если забыть изменить в теле цикла переменную, от которой зависит условие, то программа может зациклиться и зависнуть.
Функции
В языке C программист может объявить сколько угодно функций. Каждая функция объявляется так:
тип_результата название (аргументы) {
тело_функции
}
Если у функции нет аргументов, то ставят просто две скобки, а если есть, то нужно обязательно указать их тип:
#include <stdio.h>
/* объявляем функцию sqr */
float sqr(float x) {
/* возвращаем квадрат переданного числа */
return x * x;
}
/* основная функция */
void main() {
/* выводим строку и сразу вызываем функцию, которая вернёт нам квадрат числа*/
printf("Квадрат числа 4,2 равен %.3f", sqr(4.2f));
}
Классы, объекты и методы
В языке C такого нет. Если нужно ООП — используйте С++, про него будет в следующий раз.