Здесь показаны различия между двумя версиями данной страницы.
Both sides previous revision Предыдущая версия Следущая версия | Предыдущая версия | ||
help:expressions [2013/10/15 21:19] newsash |
help:expressions [2024/12/13 09:59] (текущий) aleks_versus [Приоритет операций] |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
[[help:variables|Назад: Переменные]] | [[help:variables|Назад: Переменные]] | ||
- | =====Выражения===== | + | ====== Выражения ====== |
- | Выражение - набор констант, переменных, функций, связанных различными операциями. При записи выражений возможно использование скобок. | + | **Выражение** - это набор значений, констант, переменных, функций, связанных между собой различными операциями. Программа выполняет (интерпретирует) такое выражение, вычисляя его значение. |
- | ====Обозначения==== | + | Для изменения приоритета операций в выражении могут присутствовать круглые скобки. |
- | * //[выр]// - выражение может быть как текстового, так и числового типа. | + | ===== Обозначения ===== |
- | * //[**$**выр]// - выражение текстового (строкового) типа (но при необходимости движок автоматически переведёт число в строку). | + | |
- | * //[**#**выр]// - выражение числового типа (если возможно, движок автоматически переведёт строку в число). | + | |
- | **Примечение.** Символ '**#**' использован в справке только чтобы разделить выражения произвольного и числового типов. К синтаксису QSP данный символ отношения __не__ имеет. | + | * ''%%[выр]%%'' - выражение может быть как текстового, так и числового типа. |
+ | * ''%%[$выр]%%'' - выражение текстового (строкового) типа (но при необходимости движок автоматически переведёт число в строку). | ||
+ | * ''%%[#выр]%%'' - выражение числового типа (если возможно, движок автоматически переведёт строку в число). | ||
+ | * ''%%[%выр]%%'' - выражение возвращает кортеж. | ||
- | ====Приоритет операций==== | + | **Примечание.** Символ ''%%#%%'' использован в справке только чтобы разделить выражения произвольного и числового типов. К синтаксису QSP данный символ отношения не имеет. |
- | Операции перечислены в порядке убывания приоритетов (с одинаковым приоритетом находятся на одной строке). | + | ===== Приоритет операций ===== |
- | * **(**//[выр]//**)** - выражения в скобках | + | |
- | * **+**, **-** (унарные) | + | |
- | * *****, **/** | + | |
- | * **MOD** | + | |
- | * **+**, **-** | + | |
- | * **=**, **<**, **>**, **!**, **<>**, **%%<=%%**, **>=**, **=<**, **%%=>%%** | + | |
- | * **OBJ**, **LOC**, **NO** | + | |
- | * **AND** | + | |
- | * **OR** | + | |
- | * **&** | + | |
- | **Примечание.** В плеерах на последних версиях библиотеки (т.е. Quest Navigator и те, о которых автору статьи неизвестно) операция **&** по приоритету находится между сложением/вычитанием и сравнениями. | + | Операции в выражении выполняются в порядке приоритета. Операции с одинаковым приоритетом выполняются по порядку слева направо. |
- | * Максимальная вложенность выражений - 30. Т.е. не глубже 30-ти открытых скобок. | + | Вот список операций для плееров **QSP** версии 5.9.0 в порядке повышения приоритета (от меньшего к большему): |
- | * Максимальное количество операторов на одном уровне вложенности - 100. | + | |
- | ====Описание операций==== | + | * **''OR''** |
+ | * **''AND''** | ||
+ | * **''NO''** | ||
+ | * **''=''**, **''<''**, **''>''**, **''!''**, **''<>''**, **''%%<=%%''**, **''>=''**, **''=<''**, **''%%=>%%''** (операции сравнения) | ||
+ | * **''OBJ''**, **''LOC''** | ||
+ | * **''&''** (конкатенация) | ||
+ | * **''+''**, **''-''** (сложение, вычитание) | ||
+ | * **''MOD''** | ||
+ | * **''*''**, **''/''** (умножение, деление) | ||
+ | * **''-''** (унарный минус) | ||
+ | * **''([выр])''** - выражения в скобках | ||
- | * **+**//[**#**выр]//, **-**//[**#**выр]// - унарные плюс / минус. Находятся перед числовым выражением и меняют знак у значения этого выражения (в случае "-"). | + | Выражения в **QSP** должны удовлетворять следующим условиям: |
- | * **+** , **-** , *****, **/** - сложение, вычитание, умножение, деление соответственно.\\ Операции записываются как //[**#**выр1]// **[операция]** //[**#**выр2]//. | + | |
- | * //[**#**выр1]// **MOD** //[**#**выр2]// - остаток от деления. | + | |
- | * //[выр1]// **=** //[выр2]// - верно, если значения рядом стоящих выражений равны. | + | * Максимальная вложенность выражений - 30. Т.е. не глубже 30-ти открытых и вложенных друг в друга скобок. |
- | * //[выр1]// **<** //[выр2]// - верно, если значение выражения слева меньше значения выражения справа. | + | * Максимальное количество операций на одном уровне вложенности - 100. |
- | * //[выр1]// **>** //[выр2]// - верно, если значение выражения слева больше значения выражения справа. | + | |
- | * //[выр1]// **!** //[выр2]//, //[выр1]// **<>** //[выр2]// - верно, если значения рядом стоящих выражений не равны. | + | |
- | * //[выр1]// **%%<=%%** //[выр2]//, //[выр1]// **=<** //[выр2]// - верно, если значение выражения слева меньше или равно значению выражения справа. | + | |
- | * //[выр1]// **>=** //[выр2]//, //[выр1]// **%%=>%%** //[выр2]// - верно, если значение выражения слева больше или равно значению выражения справа. | + | |
- | * **OBJ** //[**$**выр]// - верно, если в рюкзаке есть предмет //[**$**выр]//. | + | ===== Описание операций ===== |
- | * **LOC** //[**$**выр]// - верно, если в игре есть локация с названием //[**$**выр]//. | + | |
- | * **NO** //[**#**выр]// - побитовая инверсия (( **NO** //x// соответствует //-1-x//, откуда можно сделать вывод о кодировке отрицательных чисел)). В основном используется как логическая инверсия. | + | **Важно!** Поскольку в **QSP** нет булевого типа данных, истинность или ложность выражения определяется по его числовому значению. Верным считается числовое выражение, значение которого отлично от ''%%0%%''. При значении ''%%0%%'' выражение считается ложным. Для значения "верно" настоятельно рекомендуется использовать число ''%%1%%'', т.к. операции сравнения и логические операции возвращают именно это значение в случае истинности выражения. |
- | * //[**#**выр1]// **OR** //[**#**выр2]// - операция побитового "или". Во всём выражении будут равны единице те биты, которые равны единице хотя бы в одном из двух выражений. | + | |
- | * //[**#**выр1]// **AND** //[**#**выр2]// - операция побитового "и". Во всём выражении будут равны единице те биты, которые равны единице в каждом из двух выражений. | + | |
- | * //[**$**выр1]// **&** //[**$**выр2]// - операция объединения строковых выражений. Подробнее см. [[help:strings|Строки]]. | + | ==== Математические операции ==== |
- | Верным считается числовое выражение, значение которого отлично от 0. При значении 0 выражение считается ложным. Для значения "верно" настоятельно рекомендуется использовать -1, т.к. только в этом случае будут адекватно работать побитовые операторы в роли логических. | + | * **''-[#выр]''** - унарный минус. Можно поставить перед числовым выражением и таким образом поменять знак этого выражения на противоположный: <sxh qsp> |
+ | x = -12 | ||
+ | *pl -x & ! выведет на экран число 12 | ||
+ | *pl -(123*12/-10) | ||
+ | *pl -10/-5 | ||
+ | </sxh> | ||
+ | * **''+''** , **''-''** , **''*''**, **''/''** - сложение, вычитание, умножение, деление соответственно.\\ Операции записываются как **''[#выр1] [операция] [#выр2]''**: <sxh qsp> | ||
+ | 15+2*5 &! 15+2*5 = 15+10 = 25 | ||
+ | 15*2+5 &! 15*2+5 = 30+5 = 25 | ||
+ | 15*5/2 &! (15*5)/2 = 75/2 = 37 | ||
+ | 15/2*5 &! (15/2)*5 = 7*5 = 35 | ||
+ | </sxh> | ||
+ | * **''[#выр1] MOD [#выр2]''** - остаток от деления. Это операция, которой нас учат ещё в начальной школе. Если мы вычисляем, сколько раз число делится нацело на другое число, то в результате может остаться некая неучтённая часть. Например, если мы хотим разделить **10** на **3**, то число **10** нацело делится на **3** только три раза. Но **3** умножить на **3** - это **9**. Значит, от десяти осталась часть, которая не делится на **3**, это **1** (**10 - 9 = 1**). Эта часть и называется остатком от деления. Для числа **12** остаток от деления на **3** составляет ноль, поскольку двенадцать делится на **3** ровно четыре раза. Примеры: <sxh qsp> | ||
+ | 10 mod 2 & ! 10/2 = 5 -> 2*5=10 -> 10-10 = 0 -> остаток от деления 10 на 2 равен 0 | ||
+ | 10 mod 3 & ! 10/3 = 3 -> 3*3=9 -> 10-9 = 1 -> остаток от деления 10 на 3 равен 1 | ||
+ | 10 mod 4 & ! 10/4 = 2 -> 4*2=8 -> 10-8 = 2 -> остаток от деления 10 на 4 равен 2 | ||
+ | 10 mod 5 & ! 10/5 = 2 -> 5*2=10 -> 10-10 = 0 -> остаток от деления 10 на 5 равен 0 | ||
+ | 10 mod 6 & ! 10/6 = 1 -> 6*1=6 -> 10-6 = 4 -> остаток от деления 10 на 6 равен 4 | ||
+ | 10 mod 7 & ! 10/7 = 1 -> 7*1=7 -> 10-7 = 3 -> остаток от деления 10 на 7 равен 3 | ||
+ | </sxh> | ||
+ | ==== Операции сравнения ==== | ||
- | ====Примеры==== | + | * **''[выр1] = [выр2]''** - операция **равно**. Верно, если значения рядом стоящих выражений равны. Данную операцию не стоит путать с операцией присваивания, хотя на первый взгляд они похожи. Чтобы операция **равно** корректно вернула значение, она должна быть записана после ключевого слова **''IF''**, **''ELSEIF''**, **''WHILE''** или в первом аргументе функции **''IIF''**, или стоять после явного оператора вывода текста вроде **''*PL''**, или если используется с неявным оператором, быть заключённой в скобки. Примеры: <sxh qsp> |
+ | ! операция сравнения **равно** с явным указанием оператора перед ней: | ||
+ | *pl 6+12 = 6*3 & ! 6+12 = 6*3 -> 18=18 -> на экране мы увидим число 1, что означает, что значения выражений равны | ||
+ | *pl 226 = 15*15 & ! 226 = 15*15 -> 226=225 -> на экране увидим **0**, так как 226 не равно 225. | ||
+ | ! операция сравнения **равно** с неявным оператором | ||
+ | ('ab'+'cd' = 'abc'+'d') & ! на экране увидим 1, так как 'ab'+'cd' равно 'abc'+'d' | ||
+ | (13*9 = 19*3) & ! на экране увидим 0, так как 13*9 не равно 19*3 | ||
+ | ! операция сравнения в условии | ||
+ | if x = y: | ||
+ | *pl "Числа равны" | ||
+ | else | ||
+ | *pl "Числа не равны" | ||
+ | end | ||
+ | </sxh> | ||
+ | * **''[выр1] < [выр2]''** - операция **меньше**. Верно, если значение выражения слева меньше значения выражения справа. <sxh qsp> | ||
+ | *pl 37<56 & ! на экране будет число 1, так как 37 меньше 56 | ||
+ | *pl 45<23 & ! на экране будет число 0, так как 45 не меньше 23 | ||
+ | *pl 45<45 & ! на экране будет число 0, так как 45 не меньше 45 | ||
+ | if x < y: | ||
+ | "X меньше Y" | ||
+ | elseif y < x: | ||
+ | "Y меньше X" | ||
+ | else | ||
+ | "Числа равны" | ||
+ | end | ||
+ | </sxh> | ||
+ | * **''[выр1] > [выр2]''** - операция **больше**. Верно, если значение выражения слева больше значения выражения справа. <sxh qsp> | ||
+ | *pl 37>56 & ! на экране будет число 0, так как 37 не больше 56 | ||
+ | *pl 45>23 & ! на экране будет число 1, так как 45 больше 23 | ||
+ | *pl 45>45 & ! на экране будет число 0, так как 45 не больше 45 | ||
+ | if x > y: | ||
+ | "X больше Y" | ||
+ | elseif y > x: | ||
+ | "Y больше X" | ||
+ | else | ||
+ | "Числа равны" | ||
+ | end | ||
+ | </sxh> | ||
+ | * ''[выр1] **!** [выр2], [выр1] **<>** [выр2]'' - операция **не равно**. Верно, если значения рядом стоящих выражений не равны. <sxh qsp> | ||
+ | ! операция сравнения **равно** с явным указанием оператора перед ней: | ||
+ | *pl 6+12 ! 6*3 & ! 6+12 = 6*3 -> 18=18 -> на экране мы увидим число 0, что означает, что значения выражений не равны | ||
+ | *pl 226 ! 15*15 & ! 226 = 15*15 -> 226=225 -> на экране увидим **1**, так как **226** не равно **225**. | ||
+ | ! операция сравнения **равно** с неявным оператором | ||
+ | *pl 'ab'+'cd' <> 'abc'+'d' & ! на экране увидим 0, так как 'ab'+'cd' равно 'abc'+'d' | ||
+ | *pl 13*9 <> 19*3 & ! на экране увидим 1, так как 13*9 равно 19*3 | ||
+ | ! операция сравнения в условии | ||
+ | if x <> y: | ||
+ | *pl "Числа не равны" | ||
+ | else | ||
+ | *pl "Числа равны" | ||
+ | end | ||
+ | </sxh> **Примечание.** Во избежание путаницы с оператором комментария **''!''** лучше не использовать для записи операции **не равно** восклицательный знак. | ||
+ | * ''[выр1] **%%<=%%** [выр2], [выр1] **%%=<%%** [выр2]'' - операция **меньше либо равно**. Верно, если значение выражения слева меньше или равно значению выражения справа. <sxh qsp> | ||
+ | *pl 37<=56 & ! на экране будет число 1, так как 37 меньше 56 | ||
+ | *pl 45<=23 & ! на экране будет число 0, так как 45 не меньше и не равно 23 | ||
+ | *pl 45<=45 & ! на экране будет число 1, так как 45 равно 45 | ||
+ | if x <= y: | ||
+ | "X меньше либо равно Y" | ||
+ | else | ||
+ | "Y меньше X" | ||
+ | end | ||
+ | </sxh> **Примечание.** Запись ''%%=<%%'' редко применяется в других языках программирования, поэтому рекомендуем не привыкать к её использованию, хотя в **QSP** это ошибкой не будет. | ||
+ | * ''[выр1] **%%>=%%** [выр2], [выр1] **%%=>%%** [выр2]'' - операция **больше либо равно**. Верно, если значение выражения слева больше или равно значению выражения справа. <sxh qsp> | ||
+ | *pl 37>=56 & ! на экране будет число 0, так как 37 не больше и не равно 56 | ||
+ | *pl 45>=23 & ! на экране будет число 1, так как 45 больше 23 | ||
+ | *pl 45>=45 & ! на экране будет число 1, так как 45 равно 45 | ||
+ | if x >= y: | ||
+ | "X больше либо равно Y" | ||
+ | else | ||
+ | "Y больше X" | ||
+ | end | ||
+ | </sxh> **Примечание.** Запись ''**%%=>%%**'' редко применяется в других языках программирования, поэтому рекомендуем не привыкать к её использованию, хотя в **QSP** это ошибкой не будет. | ||
- | <sxh qsp> | + | ==== Логические операции ==== |
- | x=5 | + | |
- | y=6 | + | * ''**OBJ** [$выр]'' - операция проверки наличия предмета в **Инвентаре**. Верно, если в **Окне предметов** есть предмет с названием ''%%[$выр]%%''. <sxh qsp> |
- | (x ! y) OR (x <> y) &! Результат -1 | + | addobj "Отвёртка" |
- | x OR y &! Двоичное 101 OR 110 = 111 Результат 7 | + | *pl obj "Отвёртка" & ! на экране будет число 1, так как предмет **Отвёртка** есть в окне предметов |
- | x AND y &! Двоичное 101 AND 110 = 100 Результат 4 | + | *pl obj "Апельсин" &! на экране будет число 0, так как предмета **Апельсин** нет в окне предметов |
- | y MOD x &! 6/5 -> остаток 1 Результат 1 | + | if obj "Отвёртка": |
- | OBJ 'стул' &! Если в инвентаре есть предмет 'стул', то результат -1, если нет, то 0 | + | *pl "У вас есть отвёртка." |
- | LOC 'дом' &! Если в игре есть локация 'дом', то результат -1, если нет, то 0 | + | else |
- | res = x*y + y*-x/2 &! (5*6) + (6*(-5)/2)=15 Результат 15 | + | *pl "У вас нет отвёртки." |
- | res = NO x = y &! NO 0 = -1 Результат -1 | + | end |
</sxh> | </sxh> | ||
+ | * ''**LOC** [$выр]'' - операция проверки наличия локации в игре. Верно, если в игре есть локация с названием ''%%[$выр]%%''. <sxh qsp> | ||
+ | ! в игре создана локация "Густая чаща" | ||
+ | *pl loc "Густая чаща" & ! на экране мы увидим число 1 | ||
+ | if loc "Дом": | ||
+ | *pl "Вы можете войти в дом." | ||
+ | else | ||
+ | *pl "Вы не можете войти в дом." | ||
+ | end | ||
+ | </sxh> | ||
+ | * ''**NO** [$выр]'' - операция отрицания, логическое отрицание, или логическая инверсия. Если ''%%[#выр]%%'' верно, операция возвращает **0**, а если ''%%[#выр]%%'' не верно, операция возвращает **1**. Примеры: <sxh qsp> | ||
+ | *pl no 1 & ! на экране увидим 0, так как 1 соответвует верному выражению | ||
+ | *pl no 7 & ! на экране увидим 0, так как 7 соответвует верному выражению | ||
+ | *pl no 0 & ! на экране увидим 1, так как 0 соответствует неверному выражению | ||
+ | addobj "Отвёртка" | ||
+ | if no obj "Отвёртка": | ||
+ | "У вас нет отвёртки." | ||
+ | else | ||
+ | "У вас есть отвёртка." | ||
+ | end | ||
+ | </sxh> | ||
+ | * ''%%[#выр1] OR [#выр2]%%'' - операция логического "или". Всё выражение верно, если хотя бы одна из его частей верна: ''%%[#выр1]%%'' или ''%%[#выр2]%%''. Примеры: <sxh qsp> | ||
+ | *pl 1 or 1 & ! на экране увидим 1, так как обе части выражения равны 1 | ||
+ | *pl 1 or 0 & ! на экране увидим 1, так как левая часть равна 1 | ||
+ | *pl 0 or 1 & ! на экране увидим 1, так как правая часть равна 1 | ||
+ | *pl 0 or 0 & ! на экране увидим 0, так как обе части выражения равны 0 | ||
- | ====Сокращенные операции с присвоением==== | + | ! обе части выражения верны, значит и всё выражение верно: |
+ | (2=2) or (3<>2) & ! выражение вернёт 1 (правда) | ||
+ | ! одна часть выражения верна, значит всё выражение верно: | ||
+ | (2<>2) or (3<>2) & ! выражение вернёт 1 (правда) | ||
+ | ! обе части выражения не верны, значит и всё выражение не верно: | ||
+ | (2<>2) or (3=2) & ! выражение вернёт 0 (ложь) | ||
+ | </sxh> Если ''[#выр1]'' верно, значение ''[#выр2]'' не вычисляется. | ||
+ | * ''[#выр1] **AND** [#выр2]'' - операция побитового "и". Всё выражение верно, только если обе его части верны: и ''%%[#выр1]%%'', и ''%%[#выр2]%%''. Примеры: <sxh qsp> | ||
+ | *pl 1 and 1 & ! на экране увидим 1, так как обе части выражения равны 1 | ||
+ | *pl 1 and 0 & ! на экране увидим 0, так как только левая часть равна 1 | ||
+ | *pl 0 and 1 & ! на экране увидим 0, так как только правая часть равна 1 | ||
+ | *pl 0 and 0 & ! на экране увидим 0, так как обе части выражения равны 0 | ||
+ | |||
+ | ! обе части выражения верны, значит и всё выражение верно: | ||
+ | (2=2) and (3<>2) & ! выражение вернёт 1 (правда) | ||
+ | ! одна часть выражения не верна, значит всё выражение неверно: | ||
+ | (2<>2) and (3<>2) & ! выражение вернёт 0 (ложь) | ||
+ | ! обе части выражения не верны, значит и всё выражение не верно: | ||
+ | (2<>2) and (3=2) & ! выражение вернёт 0 (ложь) | ||
+ | </sxh> Если ''[#выр1]'' не верно, значение ''[#выр2]'' не вычисляется. | ||
+ | |||
+ | ==== Операции со строками ==== | ||
+ | |||
+ | Операции сравнения строк, а так же функции для работы со строками описаны в разделе [[help:strings|Строки]]. | ||
+ | |||
+ | * ''%%([$выр1] & [$выр2])%%'' - операция объединения строковых выражений (конкатенация). Не путайте с символом перечисления команд. Примеры: <sxh qsp> | ||
+ | ! в данном случае на экран будут последовательно выведены строки "26" и "27" | ||
+ | "26" & "27" | ||
+ | ! в данном случае на экран будет выведена строка "2627" | ||
+ | ("26" & "27") | ||
+ | </sxh> Во избежание путаницы, для объединения строк используйте операцию ''%%+%%'', она работает точно так же. При попытке конкатенации двух числовых значений они преобразуются в строку. | ||
+ | * ''%%[$выр1] + [$выр2]%%'' - операция объединения строковых выражений. Примеры: <sxh qsp> | ||
+ | ! в данном случае на экран будет выведена строка "2627" | ||
+ | "26" + "27" | ||
+ | </sxh> | ||
+ | |||
+ | ==== Операции с кортежами ==== | ||
+ | |||
+ | Другие операции и функции для работы с кортежами представлены в разделе [[help:tuples|Кортежи]]. | ||
+ | |||
+ | * ''([%выр1] **&** [%выр2])'' - операция объединения кортежей (конкатенация). Не путайте с символом перечисления команд. Примеры: <sxh qsp> | ||
+ | ! в данном случае на экран будут последовательно выведены кортежи [26, 27] и [37, 48] | ||
+ | [26, 27] & [37, 48] | ||
+ | ! в данном случае на экран будет выведен кортеж [26, 27, 37, 48] | ||
+ | ([26, 27] & [37, 48]) | ||
+ | </sxh> | ||
+ | * ''[%выр1] **+** [выр2]'' - операция увеличения значений кортежа. К каждому элементу кортежа ''%%%выр1%%'' будет прибавлен элемент ''%%выр2%%''. ''%%выр2%%'' может быть кортежем, тогда каждый элемент ''%%%выр1%%'' будет сложен с кортежем ''%%%выр2%%''. Примеры: <sxh qsp> | ||
+ | %tuple = [4, 10, 16] | ||
+ | %a = %tuple + 2 | ||
+ | ! %a будет равно [6, 12, 18] | ||
+ | [4, 10] + ['b', 'x'] & ! [4 + ['b', 'x'], 10 + ['b', 'x']] ! [['4b','4x'], ['10b','10x']] | ||
+ | </sxh> | ||
+ | * ''[%выр1] **-** [#выр2]'' - операция уменьшения значений кортежа. Из каждого элемента кортежа ''%%%выр1%%'' будет вычтен элемент ''%%#выр2%%''. ''%%#выр2%%'' может быть только числом. Все остальные варианты приведут к ошибке о несоответствии типов данных. Примеры: <sxh qsp> | ||
+ | %tuple = [4, 10, 16] | ||
+ | %a = %tuple - 2 | ||
+ | ! %a будет равно [2, 8, 14] | ||
+ | [4, 10] - ['b', 'x'] & ! ошибка о несоответствии типов данных | ||
+ | </sxh> | ||
+ | * ''[%выр1] **%%*%%** [#выр2]'' - операция увеличения значений кортежа. Каждый элемент кортежа ''%%%выр1%%'' будет умножен на значение элемента ''%%#выр2%%''. ''%%#выр2%%'' может быть только числом. Все остальные варианты приведут к ошибке о несоответствии типов данных. Примеры: <sxh qsp> | ||
+ | %tuple = [4, 10, 16] | ||
+ | %a = %tuple * 2 | ||
+ | ! %a будет равно [8, 20, 32] | ||
+ | [4, 10] * 'b' & ! ошибка о несоответствии типов данных | ||
+ | </sxh> | ||
+ | * ''[%выр1] **/** [#выр2]'' - операция сокращения значений кортежа. Каждый элемент кортежа ''%%%выр1%%'' будет поделён на значение элемента ''%%#выр2%%''. ''%%#выр2%%'' может быть только числом. Все остальные варианты приведут к ошибке о несоответствии типов данных. Примеры: <sxh qsp> | ||
+ | %tuple = [4, 10, 16] | ||
+ | %a = %tuple / 2 | ||
+ | ! %a будет равно [2, 5, 8] | ||
+ | [4, 10] / 'b' & ! ошибка о несоответствии типов данных | ||
+ | </sxh> | ||
+ | |||
+ | ==== Операции с присваиванием ==== | ||
+ | |||
+ | Помимо обыкновенной [[help:variables|операции присваивания]] в **QSP** существуют так же совмещённые математические операции с присваиванием. | ||
+ | |||
+ | * ''%%+=%%'' — операция "сложение с присваиванием", сочетающая в себе операции присваивания и сложения. Прибавляет к текущему значению переменной указанное значение. Общая запись: <sxh qsp> | ||
+ | имя_переменной += [выражение] | ||
+ | </sxh> Эквивалентно конструкции: <sxh qsp> | ||
+ | имя_переменной = имя имя_переменной + [выражение] | ||
+ | </sxh> Пример: <sxh qsp> | ||
+ | ! мы заменяем две операции: присвоения и сложения | ||
+ | warrior = warrior+15 | ||
+ | ! на одну (действие аналогично) | ||
+ | warrior += 15 | ||
+ | </sxh> Примечание: данную операцию можно использовать и для склейки строк. При этом строка "приклеивается в конец уже существующей строки": <sxh qsp> | ||
+ | $text = 'Вечное слово в остывшей' | ||
+ | $text += ' золе...' | ||
+ | </sxh> | ||
+ | * ''%%-=%%'' — операция "вычитание с присваиванием", сочетающая в себе операции присваивания и вычитания. Вычитает из текущего значения переменной указанное значение. Общая запись: <sxh qsp> | ||
+ | имя_переменной -= [#выражение] | ||
+ | </sxh> Эквивалентно конструкции: <sxh qsp> | ||
+ | имя_переменной = имя имя_переменной - [#выражение] | ||
+ | </sxh> Пример: <sxh qsp> | ||
+ | ! мы заменяем две операции: присвоения и вычитания | ||
+ | warrior = warrior - 15 | ||
+ | ! на одну (действие аналогично) | ||
+ | warrior -= 15 | ||
+ | </sxh> | ||
+ | * ''%%/=%%'' — операция "деление с присваиванием", сочетающая в себе операции присваивания и деления. Делит текущее значение переменной на указанное значение. Общая запись: <sxh qsp> | ||
+ | имя_переменной /= [#выражение] | ||
+ | </sxh> Эквивалентно конструкции: <sxh qsp> | ||
+ | имя_переменной = имя имя_переменной / [#выражение] | ||
+ | </sxh> Пример: <sxh qsp> | ||
+ | ! мы заменяем две операции: присвоения и деления | ||
+ | warrior = warrior / 2 | ||
+ | ! на одну (действие аналогично) | ||
+ | warrior /= 2 | ||
+ | </sxh> | ||
+ | * ''%%*=%%'' — операция "умножение с присваиванием", сочетающая в себе операции присваивания и умножения. Умножает текущее значение переменной на указанное значение. Общая запись: <sxh qsp> | ||
+ | имя_переменной *= [#выражение] | ||
+ | </sxh> Эквивалентно конструкции: <sxh qsp> | ||
+ | имя_переменной = имя имя_переменной * [#выражение] | ||
+ | </sxh> Пример: <sxh qsp> | ||
+ | ! мы заменяем две операции: присвоения и умножения | ||
+ | warrior = warrior * 2 | ||
+ | ! на одну (действие аналогично) | ||
+ | warrior *= 2 | ||
+ | </sxh> | ||
+ | |||
+ | Операции с присваиванием применимы и к кортежам. В этом случае кортежи изменяются по такому же принципу, как в операциях ''%%+%%'', ''%%-%%'', ''%%/%%'', ''%%*%%''. | ||
+ | |||
+ | ==== Другие примеры ==== | ||
- | Язык QSP поддерживает следующие сокращенные операции: | ||
<sxh qsp> | <sxh qsp> | ||
- | x += y &! x = x+y | + | x = 5 |
- | x -= y &! x = x-y | + | y = 6 |
- | x /= y &! x = x/y | + | (x ! y) OR (x <> y) &! Результат 1 |
- | x *= y &! x = x*y | + | x OR y |
+ | &! Результат 1 | ||
+ | x AND y | ||
+ | &! Результат 1 | ||
+ | y MOD x | ||
+ | &! 6/5 -> остаток 1 Результат 1 | ||
+ | OBJ 'стул' &! Если в инвентаре есть предмет 'стул', то результат 1, если нет, то 0 | ||
+ | LOC 'дом' &! Если в игре есть локация 'дом', то результат 1, если нет, то 0 | ||
+ | res = x*y + y*-x/2 &! (5*6) + (6*(-5)/2)=15 -> в res запишется число 15 | ||
+ | res = NO x = y &! NO 5 = 6 -> NO 0 -> в res запишется число 1 | ||
</sxh> | </sxh> | ||
- | ---- | + | |
[[help:coding|Вперёд: Программный код]] | [[help:coding|Вперёд: Программный код]] | ||
+ |