Язык Си с нуля — лекция 1.2 из курса CS50

Чтобы начать работу с Си, необходимо понять базовые принципы работы с памятью. В этой лекции вы узнаете о ключевом понятии – типах данных. Знание типов данных – фундамент для понимания структуры и поведения программы на Си.
Основные типы данных, с которыми вы столкнетесь, – это int
, char
, float
и double
. Каждый тип занимает определенное количество байт в памяти. int
, например, обычно занимает 4 байта, а char
– 1 байт. Понимание размеров типов данных важно для правильной работы программы.
Ключевым моментом в лекции является описание переменных. Чтобы использовать переменную, вы должны объявить её с указанием типа данных и имени. Например: int age = 30;
. Это не только создаёт переменную, но и выделяет для неё место в памяти.
Эта лекция также объясняет, как работать с арифметическими операторами (сложение, вычитание, умножение, деление) и правила приоритета при их использовании. Понимание этих правил критично для написания корректных и предсказуемых программ.
Практическое задание: проверьте, насколько корректно вы понимаете эти понятия, реализовав простую программу вычисления площадей прямоугольников. Знания из этой лекции позволят вам решить подобные задачи.
Первые шаги с компилятором и кодом
Для запуска программы на Си, вам необходим компилятор. Наиболее распространённый - GCC (GNU Compiler Collection). Установите его согласно инструкции для вашей операционной системы. После установки проверьте работоспособность, выполнив команду gcc -v
в терминале. Это покажет версию установленного компилятора.
Теперь создайте простой файл с кодом, например, hello.c
. В нём напишите:
#include
Сохраните файл. Теперь скомпилируйте его: gcc hello.c -o hello
. Эта команда использует компилятор GCC для преобразования вашего исходного кода (hello.c
) в исполняемый файл (hello
).
Запустите скомпилированную программу: ./hello
. В терминале должно появиться "Hello, world!". Если возникли ошибки, внимательно проверьте написанный код на синтаксические ошибки.
Простейшие типы данных и переменные
Для хранения данных в Си используются переменные. Каждая переменная имеет тип данных, определяющий, какой вид данных она может содержать.
- Целые числа (int): Используются для хранения целых чисел, например, 10, -5, 0.
- Короткие целые числа (short int): Предназначены для хранения меньшего диапазона целых чисел, чем int, и занимают меньше памяти. Используются при оптимизации памяти.
- Длинные целые числа (long int): Предназначены для хранения больших целых чисел, чем int.
- Символы (char): Предназначены для хранения одной буквы, цифры или символа. Например, 'a', 'Z', "1".
- Вещественные числа (float): Используются для хранения чисел с плавающей точкой (например, 3.14, -2.5).
- Двойные вещественные числа (double): Предназначены для хранения вещественных чисел с большей точностью, чем float. Используются, когда требуется повышенная точность.
Объявление переменных:
Для объявления переменной указывается её тип и имя:
int age; float price; char initial;
Инициализация переменных: Можно сразу присвоить значение переменной при объявлении.
int age = 30; float price = 99.99; char initial = 'J';
Важно! В Си, следует корректно определять и использовать типы переменных, чтобы избежать ошибок, связанных с несоответствием данных или недостаточной памятью.
- Обязательно определяйте тип данных перед именем переменной.
- Используйте инициализацию переменной для избежания неожиданных значений.
- Выбирайте тип данных, который наиболее точно отражает то, что вы храните, балансируя между точностью и размером занимаемой памяти.
Оператор | Описание | Пример использования | Результат |
---|---|---|---|
printf("строка с форматами", аргумент1, аргумент2, ...); |
printf("Привет, мир! Число: %d
", 10); |
Привет, мир! Число: 10 | |
scanf("строка с форматами", &переменная1, &переменная2, ...); |
Считывает данные с консоли. Строка с форматами содержит спецификаторы формата, соответствующие типу переменных. | int num; scanf("%d", &num); |
Пользователь вводит число, которое сохраняется в переменной num . |
Важно: scanf требует указателя на переменную (& ). Без него значение не будет сохранено. |
int num; scanf("%d", num); // НЕПРАВИЛЬНО! |
Возможна ошибка. |
Запомните: перед использованием переменных, используемых в scanf
, необходимо их объявить.
Комментарии и отступы в коде
Комментарии в Си служат для пояснений и не влияют на выполнение программы. Используйте двойные слэши (//) для однострочных комментариев и оператор «/ * ... * /» для многострочных.
Пример:
// Это однострочный комментарий
/ *
Это
многострочный
комментарий.
/
Отступы в коде Си не влияют напрямую на выполнение, но играют ключевую роль в удобочитаемости. Постоянное использование отступов (один или несколько пробелов, обычно 4) придает структуру и делает код легче понять.
Рекомендация: Используйте отступы для структурных элементов, таких как циклы, блоки `if`, `else`. Отступы в коде должны быть последовательными.
Правильный пример:
if (x > 5) {
printf("x больше 5
");
}
Неправильный пример:
if (x > 5) {printf("x больше 5
");}
Следование этим правилам обеспечит более понятный, структурированный и поддерживаемый код.
Основы арифметических операций
В Си поддерживаются стандартные арифметические операции: сложение (+), вычитание (-), умножение (*), деление (/), остаток от деления (%).
Пример:
int a = 10;
int b = 3;
int sum = a + b; // sum будет 13
int diff = a - b; // diff будет 7
int product = a * b; // product будет 30
int quotient = a / b; // quotient будет 3
int remainder = a % b; // remainder будет 1
Обратите внимание на деление целых чисел. Результат целочисленного деления (`a / b`) – целое число. Например, `10 / 3` даст 3, а не 3.33.
Важно: Остаток от деления (%) может быть использован для проверки чётности/нечётности числа. Например, если `num % 2 == 0`, то число `num` чётное.
Используйте скобки для изменения порядка вычислений, если это требуется:
int result = (a + b) * c;
Разница между компиляцией и интерпретацией
Компилятор преобразует весь исходный код программы (написанный, например, на Си) в машинный код (понятный процессору) за один проход. Интерпретатор же выполняет код строка за строкой, преобразуя каждую строку в машинный код по мере необходимости. Важно: в первом случае вы получаете исполняемый файл, во втором - нет.
Компиляция: Быстрее выполнение готовой программы. Необходимо время на компиляцию. Подходит, если нужно часто запускать программу с одними и теми же данными. Результат - исполняемый файл. Примером является компиляция программы на Си.
Интерпретация: Быстрее разработка, отладка (можно менять код и запускать его без полной перекомпиляции). Ограничение: исполнение программы медленнее, чем при компиляции. Пример: интерпретация языка Python. Пошаговая обработка кода.
Таблица сравнения:
| Характеристика | Компиляция | Интерпретация |
|---|---|---|
| Преобразование кода | В машинный код сразу | В машинный код по строчкам |
| Время компиляции | Медленно | Быстро |
| Время выполнения | Быстро | Медленно |
| Исполняемый файл | Да | Нет |
| Отладка | Сложнее | Проще |
Вопрос-ответ:
В лекции упоминается о компиляторах. Что подразумевается под этим термином и зачем они нужны при работе с языком Си?
Компилятор — это программа, которая переводит написанный вами код на языке Си в машинный код, понятный компьютеру. Машинный код — это набор инструкций, которые процессор может напрямую исполнять. Без компилятора компьютер не сможет понять, что вы хотите, чтобы он сделал, используя код на языке Си. Компилятор анализирует код, проверяет его на ошибки, а затем преобразует его в последовательность действий, которые потом выполняет процессор.
В лекции говорилось об операторах. Какие наиболее важные типы операторов приводятся в начале изучения Си, и зачем они нужны?
В начале изучения Си встречаются арифметические операторы (+, -, *, /, %), операторы присваивания (=, +=, -=, *=, /=, %=), операторы сравнения (==, !=, >, <, >=, <=), и логические операторы (&&, ||, !). Эти операторы выполняют базовые действия: сложение, вычитание, умножение, деление, сравнение значений, и выполнение логических проверок. Они нужны для составления выражений, которые управляют потоком выполнения программы и манипулируют данными.
Лекция затронула переменные. Как они объявляются, и почему это важно?
Переменные в Си объявляются с указанием типа данных (например, int для целых чисел, float для чисел с плавающей точкой, char для символов) и имени. Объявление переменной — это своего рода указание компьютеру, что нужно выделить память под хранение данных определенного типа. Эффективное объявление — залог корректной работы программы, так как память должна быть выделена верно, чтобы в дальнейшем использовать её без ошибок.
Что такое "main" функция в Си, и почему она обязательна?
"main" — это специальная функция, с которой начинается выполнение любой программы на языке Си. Она служит как точка входа для исполнения. Компилятор ищет её, чтобы понять, откуда начинать процесс выполнения кода. Без этой функции программа не сможет начать работать, так как нет места в коде, с которого она запустится.
В лекции показан пример вывода результата на экран. Как это происходит в Си, и что нужно для вывода текста и чисел?
Для вывода данных на экран в Си используется функция `printf`. Она принимает строку формата (с указанием, что выводить, например, текст или число). В строке формата используются специальные символы (например, "%d" для целых чисел, "%f" для чисел с плавающей точкой, "%s" для строк), чтобы показать, где и какой тип данных должен быть выведен. Для вывода необходимо соответствующим образом подготовить данные (например, преобразовать их в нужные типы) и указать эти данные в функции `printf`.
Курсы
.png)

.png)

.png)

.jpg)
