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

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

1 часть
10 главных конструкций языка C
2 часть
10 главных конструкций языка Go
3 часть
10 главных конструкций языка Swift
4 часть
10 главных конструкций языка Java

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

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

Текст:

Михаил Полянин

Редактура:

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

Художник:

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

Корректор:

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

Вёрстка:

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

Соцсети:

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

Веб-разработка — это новый черный
А мы знаем толк в моде и поможем освоить новую специальность за полгода.
Посмотреть
Фронтенд — это новый черный
Еще по теме
prev
next
«Нормально делай и нормально будет»
«Нормально делай и нормально будет»

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

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

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

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

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

Зачем нужны базы данных
Зачем нужны базы данных

И какие они бывают.

Системный администратор — что нужно знать, чтобы получать 160 000 рублей
Системный администратор — что нужно знать, чтобы получать 160 000 рублей

Это не тот администратор, который ставит вам Windows.

Как установить Вордпресс на свой сайт

Совсем взрослый стал, сайты свои делает, молодец.

«Никто не верил, что я сама пишу код»

Анастасия Никулина: о дата-сайнс, ютубе и программировании.

Процессоры x86 и ARM — в чём разница?
Процессоры x86 и ARM — в чём разница?

Правда ли, что процессор в вашем мобильнике мощнее, чем в вашем компьютере?

Давид Роганов о работе фронтенд-разработчика в Яндекс.Практикуме
«Успешный программист не привязывается к языку. Он просто умеет программировать»

Давид Роганов о работе фронтенд-разработчика в Яндекс.Практикуме.

«Программисты, которые умеют писать алгоритмы, — нишевая профессия»
«Программисты, которые умеют писать алгоритмы, — нишевая профессия»

Мнение работодателя Коли Митина.

Устанавливаем Вордпресс в Docker
Устанавливаем Вордпресс в Docker

Это быстрее и проще, чем кажется.

«Я не успеваю писать код, но участвую во всех важных обсуждениях». Как работает руководитель разработки Яндекс.Практикума
«Я не успеваю писать код, но участвую во всех важных обсуждениях». Как работает руководитель разработки Яндекс.Практикума

От первого сайта за 300$ до руководителя в Яндексе.

Кто такой сеньор и что он делает (он же senior)

Программист, который умеет всё.

easy