Переменные. Объявление переменных, инициализация и их использование — различия между версиями
Тест (обсуждение | вклад) м (→Объявление переменных в Перфоленте) |
Тест (обсуждение | вклад) м (→Хранение данных приложения в памяти компьютера) |
||
Строка 12: | Строка 12: | ||
== Хранение данных приложения в памяти компьютера == | == Хранение данных приложения в памяти компьютера == | ||
− | + | [[Файл:Хранение данных приложения в памяти компьютера.png|обрамить|слева|Хранение_данных_приложения_в_памяти_компьютера]] | |
Важно знать, что происходит при копировании значения из одной переменной в другую. Копирование значений обычно происходит в операции присваивания или при передаче параметра по значению в какой-нибудь метод. Содержимое (значение) структурной переменной копируется полностью, а ссылочная переменная содержит только ссылку, поэтому в новую переменную копируется именно ссылка на значение. | Важно знать, что происходит при копировании значения из одной переменной в другую. Копирование значений обычно происходит в операции присваивания или при передаче параметра по значению в какой-нибудь метод. Содержимое (значение) структурной переменной копируется полностью, а ссылочная переменная содержит только ссылку, поэтому в новую переменную копируется именно ссылка на значение. | ||
Версия 23:13, 8 июня 2020
Переменные существуют в любом императивном языке программирования. Как можно объявить, инициализировать и использовать переменные вы узнаете в этой статье.
Содержание
Объявление переменных в Перфоленте
Переменные в языке Перфолента мало чем отличаются от переменных в других языках. В переменной хранится некоторое значение. Однако не все так просто.
Значения бывают разные, большие и маленькие. Если вам надо хранить один байт, то и места под него надо столько же – один байт. Но если вам, например, надо хранить текст, т.е. строку символов, то вы даже не знаете, сколько реально места вам будет надо для хранения этого текста в памяти компьютера.
Более того, у вашего приложения технически есть две области памяти, стек приложения, доступ к которому быстрый, но его объем ограничен, и общая «куча», выделение памяти в которой происходит медленнее, но зато ее объем практически равен доступной памяти компьютера (с оговорками).
Выходит, что наиболее разумно хранить маленькие типы данных в стеке приложения, а большие типы данных в куче. Так и появилось два вида переменных «структурные» и «ссылочные». Структурные переменные содержат все свои данные «в себе» и хранятся в стеке приложения, а ссылочные переменные содержат «в себе» только ссылку на область памяти в куче, где лежат реальные данные объекта.
Хранение данных приложения в памяти компьютера
Важно знать, что происходит при копировании значения из одной переменной в другую. Копирование значений обычно происходит в операции присваивания или при передаче параметра по значению в какой-нибудь метод. Содержимое (значение) структурной переменной копируется полностью, а ссылочная переменная содержит только ссылку, поэтому в новую переменную копируется именно ссылка на значение.
Запомним, структурная переменная единолично владеет своим значением, а вот на значение объектного типа лежащее в куче могут ссылаться несколько переменных сразу!
Программистам 1С и OneScript надо научиться учитывать различия между ссылочными и структурными переменными, т.к. в этих языках де-факто все переменные ссылочные. Например, если в Перфоленте переменной типа Целое присвоить значение Неопределенно, то переменная будет содержать ноль (или пустую дату для типа Дата), а не Неопределенно. Тип Целое, как и тип Дата, это структурные типы, поэтому они всегда содержат реальные данные. Для структурных типов всегда имеется значение по умолчанию, ноль, пустая дата и т.д., которое и устанавливается при присваивании значения Неопределенно или при определении переменной без задания начального значения.
Объявление и инициализация переменных.
Переменные в языке Перфолента можно объявлять двумя принципиально различными способами – явно и неявно. Явное объявление происходит при помощи ключевого слова Перем, а неявное исключительно в операторах присваивания.
Явное объявление одной переменной
При явном объявлении вы обязаны начать определение с ключевого слова Перем. Необходимо так же указать одно из двух (или оба сразу) – тип и значение переменной.
//общий шаблон объявления Перем ИмяПеременной тип ТипПеременной = ЗначениеПеременной
//примеры Перем Индекс тип Целое = 0 Перем Имя тип Строка = "Василий" Перем Текст тип ТекстовыйДокумент = Новый ТекстовыйДокумент
//то же самое, но с указанием только значения. Тип определяется типом значения. Перем Индекс = 0 //будет тип Целое Перем Имя = "Василий" //будет тип Строка Перем Текст = Новый ТекстовыйДокумент //будет тип ТекстовыйДокумент
//структурные типы инициализировать значением не обязательно Перем Индекс2 тип Целое Перем Бт тип Байт
//ссылочные (объектные) типы инициализировать обязательно Перем Имя2 тип Строка //ошибка, необходима инициализация переменной. Перем Имя2 тип Строка = "" //правильно
Явное объявление нескольких переменных одного типа
Явное объявление нескольких переменных отличается от объявления одной переменной только тем, что вместо одного имени, необходимо перечислить через запятую имена всех переменных, которые получат одинаковый тип и будут инициализированы значением указанного выражения. Важно: выражение задающее инициализирующее значение будет вычислено столько раз, сколько имен переменных вы задали. Это значит, что каждая переменная получит свой результат выражения. Например, если вы задали выражение для значения «Новый ТекстовыйДокумент», то для каждой из указанных переменных будет создан отдельный новый объект типа ТекстовыйДокумент, а не один на всех.
//общий шаблон объявления Перем ИмяПеременной_1, ИмяПеременной_2, ИмяПеременной_3 тип ТипПеременных = ЗначениеПеременных
//примеры //для структурных типов Перем Индекс_1, Индекс_2 тип Цел64 = 777ц64 Перем Бт0, Бт1, Бт2, Бт3, Бт4, Бт5, Бт6, Бт7 тип Байт = 0b10001010 //для ссылочных (объектных) типов Перем Имя1, Имя2, Имя3 тип Строка = "<>" Перем Текст1, Текст2 тип ТекстовыйДокумент = Новый ТекстовыйДокумент
Неявное объявление переменных
Неявное объявление переменной происходит тогда, когда в программе встречается оператор присваивания значения ранее не объявленной переменной. Имя переменной не должно было раннее встречаться ни в каких объявлениях полей, переменных, констант, параметров методов, имен методов в текущей области видимости. Тип переменной определяется типом присваиваемого значения и не может быть изменен в дальнейшем.
//переменная Индекс3 получит тип Целое, т.к. 5 это целое число Индекс3 = 5 //переменная Рез3 получит тип Вещ, т.к. результат выражения это число типа Вещ //число 1 имеет тип Целое, а число 5 имеет тип Вещ, о чем говорит суффикс "в" //по правилам Перфоленты результат выражения будет иметь тип с большей точностью, т.е. Вещ Рез3 = 1+5в //переменная Бт3 получит тип Байт, т.к. суффикс "б8" указывает, что 255 имеет тип Байт Бт3 = 255б8 //переменная Симв3 получит тип Символ, т.к. суффикс "с" указывает, что это не строка, а тип Символ Симв3 = "А"с //переменная Дт3 получит тип Дата, т.к. значение задано литералом типа Дата Дт3 = '20190101' //переменная Текст3 получит тип ТекстовыйДокумент, как у исходной переменной Текст Текст3 = Текст
Еще один вид операторов присваивания, в которых можно неявно объявить переменную, является составной частью некоторых блочных операторов, таких как циклы «Для» и «Для Каждого», оператор «Присвоить», оператор «Использовать», предложение «Исключение» в операторе «Попытка». Если переменная использованная в этих операторах не объявлена, то происходит ее неявное объявление. В этих случаях переменная так же, как и при других способах объявления, имеет область видимости от места определения и до конца кода метода.
//переменная Индекс будет объявлена неявно, если не была объявлена ранее, //и получит тип Целое Для Индекс=1 По 3 Цикл //.... КонецЦикла //переменная Элемент будет объявлена неявно, если не была объявлена ранее, //и получит тип элементов содержащихся в коллекции Для Каждого Элемент Из КоллекцияЭлементов Цикл //.... КонецЦикла
//переменные А и Б будут объявлены неявно, если не были объявлены ранее //и получат типы Цел64 и Бит16 соответственно присваиваемым значениям Присвоить А, Б = 5ц64, 7б16
//переменная Зап будет объявлена неявно, если не была объявлена ранее, //и получит тип ЗаписьJSON Использовать Зап = Новый ЗаписьJSON //.... КонецИспользовать
//переменная Ош будет объявлена неявно, если не была объявлена ранее, //и получит тип Ошибка Попытка //.... Исключение Ош //.... КонецПопытки
Область видимости переменных
Объявленные явно или неявно переменные доступны в контексте метода, в котором они объявлены. Вне методов переменные объявлять нельзя. Переменная видна только тому коду, который расположен ниже ее объявления. Переменная видна как внутри блока, где она объявлена, например, блоки Если/КонецЕсли, Цикл/КонецЦикла, так и снаружи до конца метода.
Вместо переменных на уровне программы, модуля, класса, структуры и интерфейсов объявляются поля.
В отличие от языков 1С и OneScript, переменные на уровне модуля объявлять нельзя, но в блоках Программа, Модуль, Класс, Структура и Интерфейс вместо переменных можно объявлять поля, синтаксис которых совпадает с синтаксисом объявления переменных.
Программа МояПрограмма Поле МоеЦелоеПоле тип Целое = 555 Поле МоеПолеТипаСтрока тип Строка = "Здесь был Вася!" Поле МоеПолеТипаТекстовыйДокумент тип ТекстовыйДокумент = Новый ТекстовыйДокумент //в отличие от переменных, для полей ссылочного типа можно не задавать начальное значение Поле МоеПолеТипаТекстовыйДокумент2 тип ТекстовыйДокумент //и т.д. //--------------------------- Процедура Старт ВыводСтроки "Привет, мир! "+ МоеПолеТипаСтрока КонецПроцедуры КонецПрограммы