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 есть удобная штука, которая может сильно вам навредить.

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

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

easy
Что такое Ruby on Rails и зачем это нужно

Это когда веб-разработка как по рельсам

easy
Что такое вычислительная фотография и как она работает

Обработка одновременно со съёмкой

easy
Как работает мультиплеер в онлайн-играх

Изи катка

easy
Прокачиваем навыки CSS: GRID

Таблицы на максималках.

easy
Как Яндекс пережил самую крупную DDoS-атаку в истории интернета

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

easy
Новые чудеса оптимизации: как делали игру «Принц Персии»

Как сделать плавную анимацию, если доступно всего несколько кадров

easy
easy
[anycomment]
Exit mobile version