Variable/ru: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: Variable/ru
| Old | New | Line | |
|---|---|---|---|
| 1 | + | **Переменные** - это символьные последовательности, которые определяет программист и для которых выделяется память ([[Integer/ru|integer]], [[Char/ru|char]] и т.д.). Они могут находится в области видимости всей программы ([[Global variables/ru|глобальные переменные]]) или только внутри процедуры, функции, метода ([[Local variables/ru|локальные переменные]]). | |
| 2 | + | ||
| 3 | + | ## Объявление | |
| 4 | + | ||
| 5 | + | Переменные объявляются в секции [[Var|var]]. В [[Pascal|Паскале]] каждая переменная имеет [[Data type/ru|тип данных]], известный уже на этапе [[Compile time|времени компиляции]] (и пусть это будет тип данных [[Variant|variant]]). Переменная объявляется парой $`(\text{identifier}, \text{data type identifier})`$, разделенной [[Colon|двоеточием]]: | |
| 6 | + | ||
| 7 | + | ``` pascal | |
| 8 | + | var | |
| 9 | + | foo: char; | |
| 10 | + | ``` | |
| 11 | + | ||
| 12 | + | В соответствии с требованиями к пространству типа данных соответствующий объем памяти резервируется в стеке, как только вводится соответствующая [[Scope|область видимости переменной]]. В зависимости от того, где находится `var`-секция, вы можете говорить о [[Global variables/ru|глобальных]] или [[Local variables/ru|локальных]] переменных. | |
| 13 | + | ||
| 14 | + | ## Управление | |
| 15 | + | ||
| 16 | + | Переменные обрабатываются [[Becomes/ru|оператором присваивания :=]]. Кроме того, ряд встроенных процедур присваивает значения переменной неявно: | |
| 17 | + | ||
| 18 | + | - процедуры ввода/вывода, такие как, `get` и `put`, [[Read|read]] и `readLn`, `assign` и `close` | |
| 19 | + | - `new` и `dispose` при обработке [[Pointer/ru|указателей]] на [[Object|объекты]] | |
| 20 | + | - `setLength` при обработке [[Dynamic array/ru|динамических массивов]] | |
| 21 | + | ||
| 22 | + | ## Определение | |
| 23 | + | ||
| 24 | + | Переменная может быть определена, то есть объявлена и инициализирована за один раз при выполнении следующего. | |
| 25 | + | ||
| 26 | + | ``` pascal | |
| 27 | + | var | |
| 28 | + | x: integer = 42; | |
| 29 | + | ``` | |
| 30 | + | ||
| 31 | + | Обратите внимание, этот синтаксис не является оригинальным Паскалем. В Паскале декларации и назначения отделены от дизайна. Этот синтаксис нарушает этот принцип. | |
| 32 | + | ||
| 33 | + | ## Доступ | |
| 34 | + | ||
| 35 | + | Доступ к переменной означает, что значение в указанной позиции памяти читается просто при указании ее идентификатора (везде, где ожидается [[expression|выражение]]). | |
| 36 | + | ||
| 37 | + | Обратите внимание, что существует пара типов данных, которые на самом деле являются указателями, но на которые автоматически отменяются ссылки, включая, но не ограничиваясь, [[Class|классы]], динамические массивы и [[AnsiString|строки ANSI]]. С \[директивой компилятора\] `{$modeSwitch autoDeref+}` (не рекомендуется) также типизированные указатели молча освобождаются от ссылки без применения [[^/ru|^ (символа шапочки)]]. Это означает, что вы не обязательно работаете с реальным блоком памяти где-то еще, с которым переменная действительно связана. | |
| 38 | + | ||
| 39 | + | Обычно блок памяти переменной интерпретируется в соответствии с ее типом данных, как он был объявлен. С помощью [[Typecast/ru|приведения типов]] интерпретация блока памяти данной переменной может быть изменена (для выражения). | |
| 40 | + | ||
| 41 | + | ## Псевдоним памяти | |
| 42 | + | ||
| 43 | + | В сочетании с [[Keyword/ru|ключевым словом]] [[Absolute/ru|absolute]] идентификатор может быть связан с ранее зарезервированным большим двоичным объектом памяти. Пока обычная пара $`(\text{идентификатор}, \text{тип данных})`$ фактически устанавливает определенный объем памяти в стороне, следующее объявление `c` не занимает дополнительного места, но связывает идентификатор `c` с блоком памяти, зарезервированным для `x`: | |
| 44 | + | ||
| 45 | + | ``` pascal | |
| 46 | + | var | |
| 47 | + | x: byte; | |
| 48 | + | c: char absolute x; | |
| 49 | + | ``` | |
| 50 | + | ||
| 51 | + | Здесь псевдоним памяти использовался в качестве одной из многих стратегий, чтобы убедить [[Compiler|компилятор]] разрешить операции, допустимые для типа [[Char/ru|char]], в то время как основная память изначально была зарезервирована для [[Byte/ru|байта]]. Эта функция должна выбираться с умом. Это обязательно требует знания структуры памяти типа данных, чтобы ничто не вызывало какие-либо нарушения прав доступа. | |
| 52 | + | ||
| 53 | + | Самое главное, что память с дополнительными ссылками будет обрабатываться так, как если бы она была объявлена аккуратно. И никаких вопросов не было бы задано. | |
| 54 | + | ||
| 55 | + | ## См.также | |
| 56 | + | ||
| 57 | + | - [[Constant/ru|константы]] | |
| 58 | + | ||
| 59 | + | --- | |
| 60 | + | *From the Free Pascal wiki, page "Variable/ru", as it stood on 2022-08-06 after a change by Kai Burghardt, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).* | |
| 61 | + | Category: Pascal/ru |
