10 главных конструкций языка C
easy

10 главных конструкций языка C

Простое введение в сложный язык.

Быстрый обзор основных конструкций языка 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 такого нет. Если нужно ООП — используйте С++, про него будет в следующий раз.

Редактура:

Максим Ильяхов

Художник:

Даня Берковский

Корректор:

Ирина Михеева

Вёрстка:

Мария Дронова

Соцсети:

Олег Вешкурцев

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Вам может быть интересно
«Нормально делай и нормально будет»
«Нормально делай и нормально будет»

Даниил Попов о современной андроид-разработке, пользе твиттера и уходе из Авито.

easy
JavaScript для новичков: чем опасны нестрогие типы данных
JavaScript для новичков: чем опасны нестрогие типы данных

В JavaScript есть удобная штука, которая может сильно вам навредить.

medium
Myspace потеряла архивы за 12 лет. Как не потерять свои
Myspace потеряла архивы за 12 лет. Как не потерять свои

Почему так сложно сберечь важные данные и как с этим быть вообще.

easy
Что такое this в JavaScript
Что такое this в JavaScript

Это «это», но что именно означает — зависит от контекста

hard
Кто такой фронтенд-разработчик и что он делает
Кто такой фронтенд-разработчик и что он делает

Руководство для входа в профессию

easy
Разработчикам на заметку: UX-паттерны на сайтах
Разработчикам на заметку: UX-паттерны на сайтах

Как сделать так, чтобы пользователю было удобно

easy
Что такое «безголовый Хром» и за что его любят разработчики
Что такое «безголовый Хром» и за что его любят разработчики

Браузер, который никто не видит

easy
Как учатся нейронки
Как учатся нейронки

Самое простое объяснение на картинках.

hard
Можно ли полноценно работать с планшета вместо ноутбука: реальный опыт
Можно ли полноценно работать с планшета вместо ноутбука: реальный опыт
easy