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

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

Операции и их параметры

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

    operation param1 param2;


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

    operation0 (operation1 param11 (operation2 param21) param13);

как видно из примера, на месте второго параметра у operation1 находится вызов операции operation2, имеющей параметр param21, и возвращающей значение. А значение, возвращаемое операцией operation1, используется в качестве параметра у operation0. Эта техника дает возможность составлять арифметические выражения любого уровня вложенности. Например:

    (((a + b) / (c ^ 2)) * PI)

где

    a b с – переменные;

    + / ^ * – это операции;

    PI – константа.

в примере использованы вызовы операций с инфиксной записью, о них речь пойдет далее.


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

    puts( a + b );

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

    puts (a + b);

Впрочем, на результат это не повлияет. Кроме этого, в C оператор + распознается компилятором, как арифметическое действие, и он может быть записан слитно с именами или константами. В языке Ci символ + это имя операции сложения, и согласно описанным выше правилам для разделителей, оно должно быть отделено от других имен и числовых констант пробелами. В противном случае, если в последнем примере записать puts (a+b), то компилятор сочтет a+b именем операции, возвращающей значение, поскольку оно записано в круглых скобках. Если такой операции нет, компилятор выдаст сообщение об ошибке.


Возвращаемое значение некоторых операций может быть проигнорировано. Например, операция присваивания может возвращать значение, если она вызвана на месте параметра другой операции:

    a = b; `корректно`

    a = ( x + ( c = d ) ); `корректно, эквивалентно c = d; a = (x + c);`

Необходимо помнить, что одна и та же операция, вызываемая с использованием, либо с игнорированием значения, может работать по-разному.


Операции могут иметь различное фиксированное количество параметров: от 0, до максимального числа, установленного для каждой операции в отдельности. Поддерживается также переменное число параметров у отдельных операций. Значения параметров операции вычисляются по очереди слева направо. Если в качестве параметров используются вызовы других операций, то сначала будут вычислены значения всех их возвратов, и только затем начнется выполнение операции. То есть, выражение вида:

    op1 par11 (op2) par 13 (op3);

будет выполняться в следующем порядке:

  • вызов операции op2;

  • невидимой временной переменной tmp1 присваивается возвращаемое значение op2;

  • вызов операции op3;

  • невидимой временной переменной tmp2 присваивается возвращаемое значение op3;

  • вызов операции op1 par11 tmp1 par13 tmp2.

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


Некоторые операции Ci могут использоваться как в инфиксной, так и префиксной форме записи. В инфиксной форме имя операции записывается после ее первого параметра, остальные параметры записываются после имени, например: par1 op par2. В префиксной форме имя записывается перед всеми параметрами: op par1 par2. Инфиксная форма вызова операции с двумя параметрами выглядит точно также, как использование операторов в обычных языках программирования. Практически все операции, выполняющие арифметические вычисления, могут записываться в инфиксной форме, например: a = (b + c). Префиксная форма похожа на вызов функции в языке C, за тем исключением, что скобки, ограничивающие список параметров, не используются, список ограничивается либо точкой с запятой, либо закрывающей скобкой. Все операции, для которых допустима инфиксная форма записи, могут быть записаны в префиксной форме. Это означает, что выражения

    a = (b + c) ``и

    = a (+ b c) ``эквивалентны.


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

    a = ( ++ i ); `` увеличит значение переменной i на 1, и присвоит полученное значение переменной a;

    a = ( i ++ ); `` присвоит переменной a значение переменной i и потом увеличит его на 1.


В качестве отдельных параметров многих операций можно использовать только переменные. Это означает, что операция не просто использует значение переменной, но и может его изменять. Это подобно передаче адреса переменной в языке C. Наиболее часто используемой такой операцией является присвоение:

    a = b; `или` = a b;

здесь первым параметром указана переменная a, которой присваивается значение b. Операция присвоения требует первым параметром обязательно переменную, в которую она скопирует значение, полученное ей вторым параметром. Если для операции требуется только переменная, но указана константа или вызов другой операции, то будет выдано сообщение об ошибке во время компиляции. Элемент массива также является переменной, содержащей какое-то значение, и его допустимо использовать везде, где допустима простая переменная. Однако целиком массив – это не переменная, его можно передавать только тем операциям, в описании которых сказано, что они могут принимать целиком массив.


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


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


У различных операций максимальное число параметров может быть различным. По числу параметров операции можно разделить на два вида – с фиксированным числом параметров и с переменным числом от минимального до максимального. При этом могут быть операции, минимальное число параметров которых равно 0, то есть, возможен их вызов без параметров. А их максимальное число параметров меньше максимально допустимого по умолчанию. Попытка передачи параметров больше допустимого для операции числа приводит к сообщению об ошибке на этапе компиляции. Также выдается сообщение об ошибке, если операции передаются параметры, число которых меньше обязательного минимального числа. Сколько параметров может быть у каждой операции, можно узнать из ее описания. При этом следует быть внимательным, потому что одна и та же операция, вызываемая с разным числом параметров, может работать по-разному.