Перевести страницу

Создание приложений для науки и производства ещё не было таким простым

Переменные и константы

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

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


В текущей версии Ci все имена внутри одной программы должны быть уникальны. В следующих версиях уникальность будет требоваться только внутри одного блока программы. Имя переменной не может начинаться с цифры и не может содержать спецсимволы. Все остальные имена допустимы, что дает большую свободу в их выборе, чем дает язык C. Примеры допустимых имен переменных:

    a

    b12

    uint32

    c/2

    fail-safe

    #1

    *all21


В случае, если при вызове операции будет пропущен пробел, разделяющий ее имя и имя переменной, комбинация будет воспринята компилятором, как единое имя переменной или операции. То есть, запись

     (a+b)

будет восприниматься, как вызов операции с именем a+b, и будет выдана ошибка, если такой операции нет.


Для создания (или объявления) переменных в Ci-программе вместо вызова операции указывается имя типа переменных, после которого перечисляются через разделитель имена создаваемых переменных. Допускается указание более чем одного имени для создания нескольких однотипных переменных. Например, если требуется создать три переменных целочисленного типа, то достаточно написать:

    int x y, z; ``запятая пропускается, как и пробел.


При этом имена должны быть уникальны в рамках одной Ci-программы (подробнее об этом сказано далее в описании программных блоков). В качестве имен допускается использование только сочетаний символов, интерпретируемых, как уникальные имена. Вызовы операций, указание констант, обращение к существующим переменным при создании новых переменных не допускаются (кроме инициализации, смотри далее). Переменные создаются и инициализируются во время выполнения программы, при этом сам факт создания и инициализации наступает именно в том месте алгоритма, где переменная объявлена программистом. Компилятор учитывает это и не разрешает использовать переменные до того, как они будут созданы. То есть:

    i = 1; ``здесь будет выдано сообщение об ошибке – неизвестная переменная;

    int i;

    i = 1; ``а теперь все нормально.


Для читабельного представления данных различных типов в языке Ci предназначены константы. Константы многих типов внешне не отличаются от переменных, кроме того, что численные константы должны содержать только допустимые для чисел символы, это цифры, знак - (минус) у отрицательных чисел, знаки . (точка) и e (экспонента, символ латинского алфавита, допустимо E большое) у вещественных чисел. Целочисленные константы могут содержать не только цифровые символы и знак минус перед ними, но также могут быть записаны в шестнадцатеричной форме. Шестнадцатеричная запись константы должна начинаться с 0x или 0X. При этом регистр символов, представляющих числа от 10 до 15 не имеет значения. Примеры правильных шестнадцатеричных целочисленных констант:

    0xa

    0xBBaa

    0xFF1132

    0xff1132

    0x20

    0x2d

Также поддерживается двоичная запись целочисленных констант при помощи 0b, 0B, например:

    0b1001000, 0B00100.


Кроме этого, в языке Ci поддерживаются литеральные константы – это символьные имена, которыми заменяются представления постоянных значений данных различных типов. Их можно использовать везде, где использовались бы другие данные такого же типа, но они сокращают запись и делают текст программы более понятным. Замена производится во время компиляции программы, поэтому если присвоить переменной литеральную константу, то при работе программы произойдет присвоение той величины, которой эта константа соответствует. Для некоторых типов данных может быть допустимо только литеральное представление констант – например, это тип bool (логическое), константы этого типа можно записывать только как TRUE или FALSE. Константы тесно связаны с их типами, поэтому подробнее о константах речь пойдет в описаниях типов.


Переменные при создании инициализируются неким значением по умолчанию, для чисел это 0, для строк – пустая строка. Но переменные можно инициализировать необходимыми значениями сразу после объявления. Для этого, после имени создаваемой переменной, достаточно указать константу или вызов операции, возвращающей значение соответствующего или конвертируемого типа. Инициализация переменных значениями других переменных не допускается, потому что невозможно во время компиляции определить – была ли уже создана и проинициализирована переменная, значение которой используется. Например, использование:

    inta[100], b[(sizeofa)];

недопустимо, поскольку вызов sizeof во время выполнения будет производиться ДО того, как будет создан массив a. Эта ошибка обнаруживается компилятором. Но есть ситуация, которую компилятор пока не обнаруживает – это инициализация массива значением элемента другого массива:

    int a[100], b[a[0]]; `НЕДОПУСТИМО!`

такая запись не имеет смысла, поскольку должна приводить к созданию массива нулевой длины. Но в текущей версии Ci она приведет к аварийному завершению во время выполнения Ci-программы. Пока следует избегать такой инициализации.

В следующих версиях Ci эта проблема будет устранена.


Примеры правильной инициализации переменных:

    uinti 10; ``эквивалентно uinti; i = 10;

    int j k 0x8080; `j останется равным 0, k получит значение 0x8080`

    bool log1 TRUE;

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

    float a 12.1, b 1E3, c (PI / 4);

функционально эквивалентно: float a b c; a = 12.1; b = 1E3; с = (PI / 4); но код разный, в первом случае `` более компактный и правильный

    str s “string”, t ;

    block function1 {puts s}, function2 {call function1};


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

Область жизни переменной – блок, внутри которого она создана, и вложенные в него. Каждая переменная создается в том месте блока, где она объявлена в Ci программе и существует до конца работы блока. Все переменные блока автоматически удаляются при любом завершении блока. Удаление переменных производится в порядке, обратном их созданию. В подавляющем большинстве случаев это не имеет значения для прикладного программиста, однако могут возникнуть ситуации, когда это будет существенно, особенно, если переменные связаны с внешними объектами – файлами на диске, портами аппаратуры и т.д.