Инструменты пользователя

Инструменты сайта


help:expressions

Различия

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

Ссылка на это сравнение

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=+ 
-y=+  * ''​**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>
-+= y   &! x = x+y +x = 
--=   ​&! x = x-+y = 
-/=   ​&! x = x/y +(y) OR (<> ​y)  ​&​! ​Результат 1 
-x *  ​&​! ​= x*y+OR y 
 + &​! Результат 1 
 +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    &​! NO 5 = 6 -> NO 0 -> в res запишется число 1
 </​sxh>​ </​sxh>​
-----+
 [[help:​coding|Вперёд:​ Программный код]] [[help:​coding|Вперёд:​ Программный код]]
 +
help/expressions.1381871953.txt.gz · Последние изменения: 2013/10/16 01:19 (внешнее изменение)