Перейти к содержанию

Лекция 3: Язык C: начальные сведения

Я водку пробовал однажды, она не утолила жажды.


Общая характеристика языка C

C — один из наиболее популярных языков программирования. Его синтаксис стал основой для многих других языков, таких как C++, Java, JavaScript, C# и др. Программы на C хорошо переносимы между различными платформами, так как компиляторы существуют практически для всех типов процессоров.

Преимущества

  • Сочетает черты языков низкого и высокого уровней.
  • Высокая производительность и переносимость.
  • Используется для разработки операционных систем, драйверов и прошивок микроконтроллеров.

История создания

C был разработан как замена ассемблера для упрощения программирования на низком уровне. Основные области применения языка C — ядра операционных систем и микроконтроллеры.


Структура программы на языке C

Программа на C состоит из одной или нескольких функций, причём обязательной является функция main().

Общая структура программы выглядит так:

<директивы препроцессора>
<определение типов пользователя>
<описание прототипов функций>
<определение глобальных переменных>
<функции>

Пример простой программы:

#include <stdio.h>

int main(void) {
    printf("Hello, World!\n");
    return 0;
}

Основные элементы программы

  1. Директивы препроцессора: Указания для компилятора перед началом компиляции (например, #include <stdio.h>).
  2. Функция main(): Начальная точка выполнения программы. Возвращает целое число, обычно 0 при успешном завершении.

Директивы препроцессора

Препроцессор обрабатывает исходный код перед компиляцией. Директивы препроцессора начинаются с символа # и указывают компилятору, какие действия нужно выполнить.

Основные директивы

  • #include: Подключает заголовочные файлы.
  • #define: Создаёт макроопределения.

Пример макроопределений:

printf(HELLOMSG);
double area = PI * radius * radius;

Зачем нужны макросы?

Макросы упрощают поддержку кода и позволяют избежать повторений.


Функции в языке C

Функция — это подпрограмма, выполняющая определённые действия. Функции могут быть системными (например, printf, scanf) или пользовательскими (написанными программистом).

Преимущества использования функций:

  • Повышение модульности программы.
  • Возможность повторного использования кода.
  • Улучшение читаемости и удобства сопровождения программ.

Пример пользовательской функции для сложения двух чисел:

#include <stdio.h>

int sum(int x, int y) {
    return x + y;
}

int main() {
    int result = sum(5, 3);
    printf("Sum: %d\n", result);
    return 0;
}

Возврат значений функцией

Функция возвращает значение с помощью оператора return. Если функция ничего не возвращает, используется тип void.


Основные средства ввода-вывода

В языке C нет встроенных операторов ввода-вывода. Для этого используются функции из библиотеки stdio.h, такие как printf() и scanf().

Форматированный вывод с помощью printf()

#include <stdio.h>

int main() {
    int a = 5;
    float x = 2.78;
    printf("a = %d\nx = %f\n", a, x);
    return 0;
}

Управляющие символы:

  • \n — перевод строки.
  • \t — горизонтальная табуляция.

Спецификаторы форматов:

  • %d — целое число.
  • %f — вещественное число с плавающей точкой.
  • %s — строка.

Форматированный ввод с помощью scanf()

#include <stdio.h>

int main() {
    int a;
    printf("Введите число: ");
    scanf("%d", &a);
    printf("Вы ввели: %d\n", a);
    return 0;
}

Важно помнить, что функция scanf() требует указания адреса переменной для сохранения введённого значения (символ &).

Недостатки функций printf() и scanf()

  1. Отсутствие проверки типов в printf().
  2. Риск переполнения буфера в scanf().
  3. Неинтуитивное поведение scanf() с оставлением символов в буфере.
  4. Ограниченная поддержка локалей.

Альтернативы

  • snprintf() для безопасного форматированного вывода.
  • fgets() для безопасного ввода строк.
  • sscanf() для разбора строк.

Компиляция

Язык C является компилируемым. Компилятор преобразует исходный код в машинный код, который может быть исполнен процессором.

Команда для компиляции программы с использованием GCC:

gcc -Wall -g -o hello hello.c
  • -Wall — включает все разумные предупреждения компилятора.
  • -g — добавляет отладочную информацию.
  • -o hello — задаёт имя выходного файла.

Особенность компиляции с <math.h>

При компиляции программ, использующих библиотеку <math.h>, необходимо добавлять флаг -lm для подключения математической библиотеки:

gcc -Wall -g -o example example.c -lm

Интерфейс командной строки (CLI)

CLI

Для работы с программами на C в среде Linux используется интерфейс командной строки (CLI). Вы можете запускать терминал и компилировать программы с помощью GCC.

Пример использования CLI:

$ gcc -Wall -g -o hello hello.c
$ ./hello
Hello, World!

Также можно использовать онлайн-эмуляторы терминалов, такие как JSLinux, для выполнения команд в браузере.


You bowin' down to the flag, you got a bullet in your head