D3 Reference Manual

Index | Help

Поиск по страницам

Разделы / FlashBASIC / Вычисление выражений

Вычисление выражений

Арифметические выражения

Логические выражения

Операции отношения

Булевые выражения

Строки

Строковые выражения

Извлечение подстрок

Форматирование числа или строки

Сравнение числа или строки с шаблоном

Приоритеты операций

Арифметические выражения

Выполняют математические вычисления с любым набором выражений-операндов.

Операции выполняются в порядке их приоритетов за исключением случаев, когда они заключены в круглые скобки.

СимволПриоритетОперация
^1Возведение в степень
*2Умножение
/2Деление
\2Остаток деления
+3Сложение
-3Вычитание

Выражения выполняются в порядке приоритета, если не заключены в скобки.

Выражения с одинаковым приоритетом выполняются слева направо:

10+2*10 равно 30.

Прежде всего выполняются выражения в скобках, самых глубоких по уровню вложения:

(10+2)*10 равно 120.
(10+(2*10)) равно 30.

Арифметические операторы выполняют операции сложения, вычитания, умножения и деления с числовыми операндами в арифметических выражениях.

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

Если в арифметическом выражении используется строковое значение, исполнительный пакет FlashBASIC пытается преобразовать его в число. Если это не удается, используется значение "0" (ноль), и выдается предупреждение.

Примеры:

total = (invoice.amount - discount) + tax
Логические выражения

Логические выражения применяют логические (булевы) операторы к арифметическим выражениям или выражениям отношения. Возможны два результата операции: "истинно" (true) и "ложно" (false). Логические выражения считаются "ложными" при равенстве нулю и считаются "истинными" при ненулевом значении.

Логические операторы имеют самый низкий приоритет и выполняются после выполнения всех других операций. Если в выражении встречается два и более оператора, первым выполняется самый левый.

Логические операторы работают с операндами следующим образом:

a OR b   - истинно (равно 1), если  истинно "a" или "b".
a ! b    - ложно (равно 0), если и "a", и "b" ложны.
a AND b  - истинно (равно 1) , если истинны и "a", и "b".
a & b    - ложно (равно 0), если "a" или "b" или оба операнда ложны.

Функция "not" (НЕ) отрицает результат логического выражения:

not(a or b) - истинно (равно 1), если ложно "a" или "b".
not(a and b) - истинно (равно 1), если и "a", и "b" ложны. 
Операции отношения

Возвращают результат отношения двух выражений.

expression relational.operator expression

Следующие операторы отношения используются для сравнения как строк, так и чисел:

=,  #,  >=,  <=,  >  и  <

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

Возвращаемое значение может быть ненулевым ("истинно") или нулевым ("ложно").

Альтернативные формы записи операторов отношений:
=eq
#ne
>gt
<lt
>=ge
<=le

Примеры:

print 3 = 2

Результат сравнения - "0".

print 2 < "dog"

Результат ненулевой, т.к. "2" преобразуется в строку, которая по алфавиту оказывается раньше строки "dog".

equ am to char(254)
x = "623abc"
print 623 = x[1,3]

Результат ненулевой ("истинно"). Хотя первые 3 символа в "x" фактически являются символьной строкой, оператору "=" удается преобразовать их в число и выполнить арифметическую проверку на равенство.

Булевые выражения

Краткое обсуждение обработки нулей, пустых значений, строк и чисел на различных платформах D3.

Как правило, результат логического (Булева) выражения считается истинным (true), если результат вычисления равен "1" и ложным (false), если результат вычисления равен нулю.

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

x = 5
if x then stop

Поскольку "x" - ненулевое целое, программа переходит по условию "then" и останавливается. Нулевые и "пустые" значения (null) считаются в исходной системе D3 ложными. Например:

y = ""
if y then stop else print "yup"

Т.к. "y" считается ложным, будет напечатана строка "yup". В некоторых реализациях отрицательные числа рассматриваются как ложные, а положительные - как истинные. Истинными считаются также "+", "-", ".", "+." и "-.".

Это значит, что для выяснения того, как конкретная система обрабатывает истинные и ложные значения, может потребоваться "тест на истинность". Такой тест можно выполнить с помощью следующей программы:

loop
 print "value to test " :
 input value
 until value = "quit" do
 if value then print "true" else print "false"
repeat

Эти команды следует попробовать выполнить с положительными и отрицательными числами, буквами, "пустым" значением (null <return>) и прочими всевозможными значениями.

Выражения отношения дают "1", если условие выполняется, и 0 (ноль), если нет.

Приоритет операторов сравнения ниже приоритета всех арифметических и строковых операторов, поэтому они выполняются после выполнения всех арифметических и строковых операторов.

В логическом выражении:

x=y

сравниваемые пары, состоящие из однотипных и разнотипных символов, обрабатываются следующим образом:

  • Если "x" и "y" являются цифровыми значениями, выполняется цифровое сравнение.
  • Если "x" - число, а "y" - строка, или "x" - строка, а "y" - число, делается попытка преобразования строки в числовой эквивалент. В случае успешного преобразования сравнение будет цифровым. Если преобразование невозможно, число преобразуется в строку, и сравнение будет лексическим.
  • Если и "x", и "y" являются строками, обе строки, если это возможно, преобразуются в числа, после чего проводится цифровое сравнение. В противном случае проводится лексическое сравнение.
  • Если различение регистров не задано, регистр символов на результат сравнения не влияет.

Примеры:

if "a" = "A" then..

В случае, если различение регистров не задано (casing off), выражение истинно. В случае, если различение регистров задано (casing on), оно ложно.

x = "1"
y = "001"
if x=y then crt 'equal' else crt 'not equal'

Т.к. и "x", и "y" дают число "1", выдается слово "equal".

Строки

Символы ' " \ используются для определения начала и конца строки.

Символ обозначающий начало строки и заканчивающий строку должны быть одинаковы.

Как правило, тип кавычек, используемых с литералами (символьными строками) не имеет значения. Но некоторые инструкции (например, "heading" и "footing") накладывают определенные ограничения на их использование.

Если литерал должен содержать простую кавычку, он обрамляется двойными кавычками (") или символами обратной косой черты (\).

Примеры:

if answer = 'quit' then stop

В этом примере используются простые кавычки для определения того, содержит ли переменная "answer" символьную строку "quit".

heading "'lc'Pick Systems'l'"

Этот пример иллюстрирует использование двух типов кавычек, что в данном случае связано с ограничениями, налагаемыми оператором "heading". См. "heading".

execute \list entity heading "'lc'Entity'l'"\

Согласно правилам языка AQL символьная строка в операторе "heading" должна быть заключена в двойные кавычки. Опции оператора "heading" заключаются в апострофы ('). Все это вместе передается как литерал благодаря обрамлению символами обратной косой черты (\).

Строковые выражения

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

Соединение (конкатенация) строк задается двоеточием (:) или оператором "cat". Перед оператором "cat" и после него должны быть пробелы.

Результатом строкового выражения является строка ASCII-символов.

Строковые выражения могут включать арифметические выражения. Результаты любой численной функции или арифметического выражения преобразуются в эквивалентную ASCII-строку.

Примеры:

print "the total amount is " : amount

Строковое выражение состоит из литерала "the total amount is ", за которым следует содержимое переменной "amount".

line = "the total amount is " cat unit.price * quantity

Результат арифметического выражения "unit.price * quantity" преобразуется в ASCII и присоединяется к строковому литералу.

Извлечение подстрок
string.expression[beg.pos.expression, len.expression]  

Данная операция позволяет извлечь определенный фрагмент (подстроку) из строки. Выражение указателя начальной позиции ("beg.pos.expression") должно давать число, задающее начальную позицию в строке, а выражение длины ("len.expression") - число, обозначающее количество извлекаемых символов.

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

Если указанная длина извлекаемого фрагмента ("len.expression") превышает количество символов, оставшихся в строке, извлекается только оставшаяся часть строки. Если длина извлекаемого фрагмента равна нулю или отрицательна, возвращается пустая подстрока.

Примеры:

if response[1,1] = "y" then printer on

В этом примере первый символ переменной "response" поверяется на равенство символу "y". Если результат положителен, выполняется оператор "printer on". Пояснения касательно различения верхнего и нижнего регистров на вводе см. в разделе "casing".

area.code = phone[1,3]

Из переменной "phone" извлекаются первые три символа, и полученное значение присваивается переменной "area.code"

Форматирование числа или строки
num.expression mask.expression
string.expression mask.expression

Формирование выражений с посощью цифровых и форматных масок.

"mask.expression" представляет собой следующее:

{r|l|d{n}{s}{z}{,}{c}{$}({{{f},l}...})

где:

  • r|l|d - правое выравнивание ((r)ight) и левое выравнивание ((l)eft). По умолчанию предполагается выравнивание слева. Спецификатор "d" работает аналогично "r" и предоставляется только для обеспечения совместимости.
  • n - количество десятичных знаков. Это одна цифра, указывающая, сколько десятичных разрядов должно быть выдано после десятичной точки. Если n = 0, десятичная точка не выдается. Если выдаваемое число содержит после точки больше десятичных разрядов, чем указано для n, оно округляется.
  • s - коэффициент масштабирования. Это одноразрядное число задает изменение "масштаба" выводимого значения на 's'-ю степень числа 10. Hапример, значение "s", равное 2, превращает 1000 в 10.
  • z - подавление ведущих нулей.
  • , - вставляет в значение запятые между разрядами, кратными "тысячам".
  • $ - добавляет перед значением символ доллара.
  • f - символ-"заполнитель"
  • l - длина
  • c - код:
  • c - выдает символы "CR" ("Кредит") после отрицательных значений. За положительными и нулевыми значениями следуют два пробела.
  • d - выдает символы "DB" ("Дебет") после положительных значений. За отрицательными и нулевыми значениями следуют два пробела.
  • e - заключает отрицательные значения в "<" и ">". За положительными или нулевыми значениями следует пробел.
  • m - помещает знак "минус" справа от отрицательных значений. За положительными или нулевыми значениями следует пробел. Обычно знак "минус" появляется слева от отрицательного числа.
  • n - подавляет знак "минус" для отрицательных значений.

Специальные заполняющие символы:

  • %n = заполняет "n" нулями
  • #n = заполняет "n" пробелами
  • *n = заполняет "n" звездочками

В маску заполнения могут быть включены любые другие символы, включая круглые скобки. Символы выдаются в том виде, как они представлены в маске. Если знак доллара задан вне форматной маски, он выдается непосредственно перед значением независимо от заполняемого поля. Если же он используется в форматной маске, он выдается в самой левой позиции независимо от заполняемого поля. Скобки игнорируются, если они являются первым символом маски.

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

Коды маски форматирования управляют размером выдаваемого поля и символами-заполнителями. Вся строка форматирования должна быть заключена в апострофы. Если используется форматная маска, то между апострофами она заключается еще и в скобки.

Вся строка форматирования может указываться как литерал или присваиваться как значение переменной. Форматный литерал должен следовать сразу после строки, которую он форматирует. Переменная, содержащая форматную строку, должна быть отделена от строки, подлежащей форматированию, не менее, чем одним пробелом. Форматные строки можно также прямо использовать в операторе печати "print".

Следующие коды масок должны задаваться в том порядке, в котором они перечислены.

Описание маски d{ } - если эта маска задана перед любой другой, она означает стандартное преобразование даты, и все остальные коды масок игнорируются. c - если эта маска задана перед любой другой, могут быть заданы различные символы маски (типа "cu" или "cl") - точно так же, как, например, в 'oconv(string,"mcu")'.

Примеры:

print x "l#12"

Значение "x" выравнивается по левому краю в поле из 12 символов. Если значением "x" является слово "test", выходные данные выглядят следующим образом (пробелы представлены строчной буквой "b"):

testbbbbbbbb
print y "r#15"

"y" выравнивается по правому краю в поле из 15 символов и дополняется пробелами. Если значением "y" является слово "hello", выходные данные будуи выглядеть следующим образом (здесь пробелы также изображены буквой "b"):

bbbbbbbbbbhello
print z "r24z,e$*12"

В отличие от преобразования "mr2", используемого в функциях "oconv" или "iconv", здесь маскируется значение "z", основанное на "точности" ("precision") конкретной исполняющей системы FlashBASIC (runtime).

Если значение "z" равно 78657767, а текущая "точность" равна 4, фактическая величина масштабирования равна заданному коэффициенту масштабирования минус точность. Т.к. коэффициент масштабирования равен точности, никакого масштабирования не происходит. После оценки величины масштабирования маска добавляет два нуля после десятичной точки и выравнивает результат в поле из звездочек. Т.к. маска задана с недостаточным количеством звездочек для принятия результата. на экран выдаются только 12 правых символов.

Если "z" равно 78657767, выходные данные выглядят так:

,657,767.00
print oconv(date(),"d2/") "r#10"

В данном примере выдается текущая системная дата во внешнем формате с выравниванием вправо и заполнением пробелами в 10-символьном поле. Выходные данные выглядят так:

bbmm/dd/yy
Сравнение числа или строки с шаблоном
string.expression1 match{es} string.expression2

Проверяет строку на соответствие ее заданному шаблону из алфавитных, цифровых, литеральных символов и символов-"джокеров".

Оператор сравнения сравнивает строковое значение с заданным шаблоном и дает результат "1" (истинно) или "0" (ложно).

Выражение "string.expression2" может быть комбинацией литералов и/или операторов соответствия, указанных после параметра длины. Операторы соответствия:

  • na - приемлемы только "n" буквенных символов.
  • mn - приемлемы только "m" цифровых символов.
  • nx - приемлемы "n" любых символов ("wildcards").

'literal' - приемлема любая строка, заключенная в апострофы.

Параметр "n" задает длину строкового значения. Спецификация длины, равная 0 (нулю), допускает в последующих операторах соответствия длину ноль или более символов. Если имеется сочетание строк шаблона и литералов, вся соответствующая конструкция должна быть заключена в двойные кавычки.

Символ "n" проверяет только на десятичные цифры. Символы "+", "-" и "." цифрами HЕ считаются.

Функция "iconv", использующая код обработки для сравнения с шаблоном ("p"), обеспечивает те же действия, что и оператор "match" (или "matches"), но с той разницей, что функция "iconv" может одновременно осуществлять несколько проверок на соответствие в то время, как "match" или "matches" требует использования соответствующего количества операторов.

Примеры:

if answer matches "3n" then print "ok"

В этом примере предложение "then" выполняется в случае, если значение "answer" представляет собой 3 символа.

if soc.sec.num matches "3n'-'2n'-'4n" then...

Этот пример проверяет, состоит ли значение переменной "soc.sec.num" из 3 цифр, символа тире, 2 цифр, тире и 4 цифр.

if not(response matches "0n") then...

Предложение "then" выполняется в случае, если значение "response" НЕ представляет собой ноль или более цифр.

if response = "0n,0n,0n" then...

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

Приоритеты операций

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

В зависимости от операции выражения обрабатываются слева направо (левоассоциативные), справа налево (правоассоциативные) или без ассоциативности. Hапример, умножение и деление являются левоассоциативными. Следующее выражение обрабатывается слева направо:

x = 9 / 3 * 2

Здесь сначала 9 делится на 3, а затем результат деления (3) умножается на 2. Конечный результат равен 6. При выполнении данного выражения как право-связанного (когда сначала 3 умножается на 2, а затем 9 делится на произведение) результат равен 1.5.

Логические операции не имеют ассоциативности. Hапример, следующее выражение не компилируется:

x = 1 < x < 3

Добавлении скобок делает выражение компилируемым:

x = (1 < x) < 3

Но добавление скобок не дает результат "(1 < x) and (x < 3)".

x = ( 99 < 1 ) < 3
x = ( 0  < 1 ) < 3

Результатом обеих выражений будет 1. В первом примере (99<1) вычисляется в 0, 0<3 вычисляется в 1. Во втором примере (0<1) вычисляется в 1, 1<3 вычисляется в 1.

Hиже приведена таблица операций, их приоритетов и ассоциативности.

СимволПриоритет ОперацияАссоциативность
()0 (высший)СкобкиНет
[]1Извлечение построкиНет
<>1Обращение к динамическому массивуНет
^, **2Возведение в степеньЛевая
*3УмножениеЛевая
/3ДелениеЛевая
\3ОстатокЛевая
+СложениеЛевая
-ВычитаниеЛевая
+Унарный плюсПравая
-Унарный минусПравая
"mask"Форматирование строкиЛевая
cat, :КонкатенацияПравая
eq, =РавноНет
ne, #, <>, ><Не равноНет
lt, <Меньше чемНет
le, <=Меньше или равноНет
gt, >Больше чемНет
ge, >=Больше или равноНет
match, matchesСоответствует шаблонуНет
and, &8Логическое "И"Левая
or, !8Логическое "ИЛИ"Левая

Выражения вычисляются в порядке приоритетов, если они не заключены в скобки. Выражение 10+2*10 равно 30. Выражения в скобках, вложенных на самую большую глубину, вычисляются первыми. (10+2)*10 равно 120.

Примеры:

if x then...

Условие "then" принимается в случае, если "x" является ненулевым числом. Любое цифровое значение "x", не равное нулю, считается истинным независимо от того, является "x" числовой константой или ASCII-строкой.

word = "apple"
chr = word[1,1]
print "A":
print str("n",chr="a" or chr = "e" or chr = "i" or 
 chr = "o" or chr = "u") :
print " ":word

Т.к. chr = "a", печатается "An apple".

visit.date = customer.item<5>
if visit.date then ...

В этом примере условие "then" выполняется в случае, если "visit.date" принимает ненулевое числовое значение.

if x > 1 and x < 10 then...

Условие "then" принимается только в случае, если "x" находится в диапазоне от 2 до 9 включительно.

if (x > 1 and x < 10) or (x >= 100 and x <= 200) then...

Условие "then" принимается в случае, если "x" находится в диапазоне от 1 до 10, не включая эти значения, или от 100 до 200 включительно.

if not(print.flag = "n") then printer on

Оператор "printer on" выполняется, если значение "print.flag" не равно "n".