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

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
Кто такой инженер по тестированию и стоит ли на него учиться

Раскладываем по полочкам новую профессию.

easy
Никаких оправданий и «не могу»
Никаких оправданий и «не могу»

Анна Леонова: из китаиста в программисты.

easy
Как устроены электронные чернила
Как устроены электронные чернила

Разбираем технологию e-ink

easy
Вас догонят. Как реклама ловит нас в интернете
Вас догонят. Как реклама ловит нас в интернете

Конспект подкаста «Запуск завтра»

easy
Как устроен React
Как устроен React (на примере статьи про эпидемию)

Это как JavaScript, только интереснее.

hard
Как работает умный дом
Как работает умный дом

Самое понятное применение интернета вещей в жизни

easy
Что такое генераторы в программировании
Что такое генераторы в программировании

Они лениво раз за разом вычисляют новые значения, но не помнят, что было до этого.

medium
Делаем игру Wordle на JavaScript
Делаем игру Wordle на JavaScript

Прокачиваем свой английский

medium
Почему в Windows нельзя создать папку или файл с именем Con
Почему в Windows нельзя создать папку или файл с именем Con

Всё дело в обратной совместимости

easy
Двоичное счисление на пальцах

Все знают, что компьютеры состоят из единиц и нулей. Но что это значит на самом деле?

easy
easy