doc: add 'basics-and-types' doc
This commit is contained in:
@@ -0,0 +1,199 @@
|
||||
# Основы и типы
|
||||
|
||||
В первой программе мы уже попросили FZLang вывести текст на экран.
|
||||
Это хороший старт: программа — не что-то загадочное, а набор инструкций, которые компьютер выполняет одну за другой.
|
||||
Теперь разберёмся, как эти инструкции устроены, как сохранить данные и как попросить программу принять решение.
|
||||
|
||||
Не переживайте, если некоторые слова — например, «тип» или «выражение» — пока звучат непривычно.
|
||||
Мы будем разбирать их на небольших примерах.
|
||||
Попробуйте не только читать код, но и менять значения: так гораздо легче увидеть, что именно делает программа.
|
||||
|
||||
## Первая программа: инструкция и комментарий
|
||||
|
||||
Встроенная функция `printline` выводит переданное ей значение в стандартный вывод:
|
||||
|
||||
```fz
|
||||
printline("Привет, FZLang!");
|
||||
```
|
||||
|
||||
Здесь мы вызываем функцию `printline` и передаём ей текст в круглых скобках.
|
||||
Кавычки показывают, где текст начинается и заканчивается.
|
||||
Точка с запятой сообщает, что инструкция завершена.
|
||||
Попробуйте заменить приветствие на своё — программа выведет именно тот текст, который вы ей передали.
|
||||
|
||||
Код не обязан состоять только из команд.
|
||||
В него можно добавлять пояснения для себя и других читателей — комментарии.
|
||||
Однострочный комментарий начинается с `//`; всё, что стоит после этих символов до конца строки, программа пропускает:
|
||||
|
||||
```fz
|
||||
// Сначала посчитаем, потом выведем результат.
|
||||
printline(2 + 2);
|
||||
```
|
||||
|
||||
Комментарий не влияет на выполнение программы. Он помогает объяснить, зачем написан код, особенно когда вы вернётесь к нему позже.
|
||||
|
||||
## Переменные: давайте дадим значениям имена
|
||||
|
||||
Представьте, что программе нужно несколько раз использовать одно и то же значение.
|
||||
Можно каждый раз писать его заново, но удобнее сохранить его под именем.
|
||||
Для этого существуют переменные — именованные места для значений.
|
||||
|
||||
При объявлении переменной указывают её тип, имя и, если нужно, начальное значение:
|
||||
|
||||
```fz
|
||||
int count = 10;
|
||||
str greeting = "Здравствуйте!";
|
||||
bool ready = true;
|
||||
```
|
||||
|
||||
В этих строках мы создали три переменные: `count` хранит число, `greeting` — текст, а `ready` — ответ «да» или «нет».
|
||||
Тип помогает языку понять, с каким значением мы работаем. Например, число можно складывать, а текст удобно выводить как сообщение.
|
||||
|
||||
Переменную можно сначала объявить, а значение присвоить позже:
|
||||
|
||||
```fz
|
||||
u64 total;
|
||||
total = 15;
|
||||
printline(total);
|
||||
```
|
||||
|
||||
Когда переменная уже объявлена, её имя можно использовать, чтобы прочитать значение или присвоить новое.
|
||||
Например, `count = count + 1;` означает: взять текущее значение `count`, прибавить единицу и сохранить результат обратно.
|
||||
Если до этого `count` было равно 10, после инструкции оно станет равно 11.
|
||||
|
||||
### Числа: целые и разных размеров
|
||||
|
||||
Для целых чисел в FZLang есть знаковые и беззнаковые типы.
|
||||
Знаковые числа могут быть отрицательными, а беззнаковые предназначены для неотрицательных значений.
|
||||
Например, температуру ниже нуля удобно представить знаковым типом, а количество посетителей — беззнаковым:
|
||||
|
||||
```fz
|
||||
int temperature = -5;
|
||||
uint visitors = 42;
|
||||
```
|
||||
|
||||
Для более точного выбора есть типы фиксированной ширины: `i8`, `i16`, `i32`, `i64` и их беззнаковые варианты `u8`, `u16`, `u32`, `u64`.
|
||||
Число после `i` или `u` указывает ширину типа в битах. Типы `int` и `uint` имеют размер машинного слова.
|
||||
|
||||
```fz
|
||||
i16 offset = -120;
|
||||
u8 level = 7;
|
||||
```
|
||||
|
||||
На первых шагах достаточно запомнить, что `int` подходит для обычных целых чисел, а точный тип можно выбрать, когда это действительно важно.
|
||||
Числовые типы совместимы между собой по правилам языка, но при объявлении переменной тип всё равно указывается явно.
|
||||
|
||||
### Логические значения и текст
|
||||
|
||||
У типа `bool` всего два значения: `true` (истина) и `false` (ложь).
|
||||
Это удобно, когда нужно хранить ответ на вопрос: например, открыта ли дверь или готова ли программа продолжать работу.
|
||||
|
||||
```fz
|
||||
bool is_open = true;
|
||||
printline(is_open);
|
||||
```
|
||||
|
||||
Для текста используется тип `str` (строка):
|
||||
|
||||
```fz
|
||||
str language = "FZLang";
|
||||
printline(language);
|
||||
```
|
||||
|
||||
В справочнике типов также упоминается `char`, но в текущей версии языка он не используется.
|
||||
Классы и объектные значения мы оставим для следующих разделов — пока достаточно освоиться с числами, текстом и логическими значениями.
|
||||
|
||||
## Выражения: попросим программу посчитать
|
||||
|
||||
Выражение — это часть кода, которую можно вычислить и получить значение.
|
||||
Самый простой пример — `2 + 2`. Выражения можно сохранять в переменные или передавать функциям:
|
||||
|
||||
```fz
|
||||
int result = 2 + 2 * 2;
|
||||
printline(result);
|
||||
```
|
||||
|
||||
Здесь программа сначала вычисляет выражение, сохраняет результат в `result`, а затем выводит его.
|
||||
Как и в обычной математике, умножение выполняется раньше сложения, поэтому результат будет 6.
|
||||
Если хотите изменить порядок вычислений, используйте скобки: ` (2 + 2) * 2`.
|
||||
|
||||
Для чисел доступны сложение `+`, вычитание `-`, умножение `*`, деление `/`, остаток от деления `%` и возведение в степень `^`.
|
||||
Унарный минус позволяет записывать отрицательные числа, например `-5`.
|
||||
|
||||
Сравнения помогают задавать вопросы о значениях. Операторы `==` и `!=` проверяют равенство и неравенство, а `<`, `<=`, `>` и `>=` сравнивают числа.
|
||||
Результат сравнения — логическое значение `true` или `false`:
|
||||
|
||||
```fz
|
||||
bool enough = result >= 4 && result != 0;
|
||||
printline(enough);
|
||||
```
|
||||
|
||||
В примере переменная `enough` станет истинной, только если `result` не меньше 4 и одновременно не равен нулю.
|
||||
Оператор `&&` означает «и», `||` — «или», а `!` меняет логическое значение на противоположное.
|
||||
Полный перечень операций и их ограничений приведён в справочнике [«Операторы»](../reference/operators.md).
|
||||
Учтите, что при сравнении объектов `==` и `!=` проверяют, ссылаются ли переменные на один и тот же объект, а не совпадает ли содержимое объектов.
|
||||
|
||||
## Блоки и условия: программа выбирает путь
|
||||
|
||||
Иногда программе нужно выполнить разные действия в зависимости от ситуации.
|
||||
Для этого есть условие `if`. Оно проверяет логическое выражение и выполняет подходящую ветвь:
|
||||
|
||||
```fz
|
||||
bool is_ready = true;
|
||||
|
||||
if (is_ready)
|
||||
{
|
||||
printline("Можно продолжать");
|
||||
}
|
||||
else
|
||||
{
|
||||
printline("Нужно подождать");
|
||||
}
|
||||
```
|
||||
|
||||
Если `is_ready` равно `true`, программа выведет первое сообщение; иначе — второе.
|
||||
Ветвь `else` можно опустить, если для случая «нет» ничего делать не нужно.
|
||||
Если вариантов больше двух, можно добавить `else if` с ещё одним условием.
|
||||
|
||||
Фигурные скобки `{}` объединяют инструкции в блок. Вы уже встречали их в примере с условием; такие блоки используются также в функциях.
|
||||
Они помогают видеть, какие инструкции относятся к одной части программы.
|
||||
Условие `if` должно иметь тип `bool` — например, результат сравнения или логическая переменная.
|
||||
|
||||
## Функции: соберём полезные действия
|
||||
|
||||
Когда одну и ту же последовательность действий хочется использовать в разных местах, её можно оформить как функцию.
|
||||
Функция получает значения через параметры, выполняет инструкции и при необходимости возвращает результат.
|
||||
|
||||
```fz
|
||||
fn sum(int left, int right) int
|
||||
{
|
||||
return left + right;
|
||||
}
|
||||
|
||||
int result = sum(2, 3);
|
||||
printline(result);
|
||||
```
|
||||
|
||||
Объявление начинается с `fn`, затем идут имя функции, параметры и тип результата.
|
||||
В этом примере `sum` принимает два значения типа `int`, складывает их и возвращает результат типа `int`.
|
||||
Ключевое слово `return` передаёт этот результат туда, откуда функцию вызвали.
|
||||
Поэтому вызов `sum(2, 3)` можно использовать как выражение — например, присвоить его результат переменной.
|
||||
|
||||
## Что запомнить
|
||||
|
||||
Вы уже познакомились с основными строительными блоками программы: инструкциями, комментариями, переменными, типами, выражениями, условиями и функциями.
|
||||
Не обязательно запоминать все операторы сразу — к справочнику можно возвращаться по мере необходимости.
|
||||
|
||||
- Переменная хранит значение и имеет имя и тип.
|
||||
- Для первых примеров пригодятся числа (`int`, `uint` и типы фиксированной ширины), логические значения (`bool`) и строки (`str`).
|
||||
- Выражения позволяют вычислять новые значения, а сравнения помогают принимать решения.
|
||||
- Условия `if` и блоки `{}` управляют тем, какие инструкции выполнит программа.
|
||||
- Функции объединяют действия и могут возвращать результат.
|
||||
- Инструкции обычно заканчиваются точкой с запятой, а `printline` помогает увидеть результат работы программы.
|
||||
|
||||
---
|
||||
|
||||
Далее: [Система типов](../reference/types_system.md)
|
||||
|
||||
Назад: [Начало работы](./01_getting-started.md)
|
||||
|
||||
Reference in New Issue
Block a user