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

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


help:expressions

Различия

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

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

Both sides previous revision Предыдущая версия
Следущая версия
Предыдущая версия
help:expressions [2022/12/31 12:39]
aleks_versus статья переписана
help:expressions [2025/10/03 12:11] (текущий)
aleks_versus [Логические операции]
Строка 2: Строка 2:
  
 ====== Выражения ====== ====== Выражения ======
- 
  
 **Выражение** - это набор значений,​ констант,​ переменных,​ функций,​ связанных между собой различными операциями. Программа выполняет (интерпретирует) такое выражение,​ вычисляя его значение. **Выражение** - это набор значений,​ констант,​ переменных,​ функций,​ связанных между собой различными операциями. Программа выполняет (интерпретирует) такое выражение,​ вычисляя его значение.
Строка 10: Строка 9:
 ===== Обозначения ===== ===== Обозначения =====
  
 +  * ''​%%[выр]%%''​ - выражение может быть как текстового,​ так и числового типа.
 +  * ''​%%[$выр]%%''​ - выражение текстового (строкового) типа (но при необходимости движок автоматически переведёт число в строку).
 +  * ''​%%[#​выр]%%''​ - выражение числового типа (если возможно,​ движок автоматически переведёт строку в число).
 +  * ''​%%[%выр]%%''​ - выражение возвращает кортеж.
  
-  ''​[выр]''​ - выражение может быть как текстового,​ так и числового типа. +**Примечание.** Символ ''​%%#%%''​ использован в справке только чтобы разделить выражения произвольного и числового типов. К синтаксису QSP данный символ отношения не имеет.
-  ''​[$выр]''​ - выражение текстового (строкового) типа (но при необходимости движок автоматически переведёт ​число в строку). +
- *  ''​[#​выр]''​ - выражение числового типа (если возможно,​ движок автоматически переведёт строку в число). +
- +
-**Примечение.** Символ ''​**#**''​ использован в справке только чтобы разделить выражения произвольного и числового типов. К синтаксису QSP данный символ отношения не имеет.+
  
 ===== Приоритет операций ===== ===== Приоритет операций =====
- 
  
 Операции в выражении выполняются в порядке приоритета. Операции с одинаковым приоритетом выполняются по порядку слева направо. Операции в выражении выполняются в порядке приоритета. Операции с одинаковым приоритетом выполняются по порядку слева направо.
  
-Вот список операций для плееров **QSP** версии 5.8.0 в порядке повышения приоритета (от меньшего к большему): ​+Вот список операций для плееров **QSP** версии 5.9.0 в порядке повышения приоритета (от меньшего к большему):​ 
 + 
 +  * **''​OR''​** 
 +  * **''​AND''​** 
 +  * **''​NO''​** 
 +  * **''​=''​**,​ **''<''​**,​ **''>''​**,​ **''​!''​**,​ **''<>''​**,​ **''​%%<​=%%''​**,​ **''>​=''​**,​ **''​=<''​**,​ **''​%%=>​%%''​** (операции сравнения) 
 +  * **''​OBJ''​**,​ **''​LOC''​** 
 +  * **''&''​** (конкатенация) 
 +  * **''​+''​**,​ **''​-''​** (сложение,​ вычитание) 
 +  * **''​MOD''​** 
 +  * **''​*''​**,​ **''/''​** (умножение,​ деление) 
 +  * **''​-''​** (унарный минус) 
 +  * **''​([выр])''​** - выражения в скобках
  
- * ''​**OR**''​ 
- * ''​**AND**''​ 
- * ''​**NO**''​ 
- * ''​**=**'',​ ''​**<​**'',​ ''​**>​**'',​ ''​**!**'',​ ''​**<>​**'',​ ''​**%%<​=%%**'',​ ''​**>​=**'',​ ''​**=<​**'',​ ''​**%%=>​%%**''​ (операции сравнения) 
- * ''​**OBJ**'',​ ''​**LOC**''​ 
- * ''​**&​**''​ (конкатенация) 
- * ''​**+**'',​ ''​**-**''​ (сложение,​ вычитание) 
- * ''​**MOD**''​ 
- * ''​*****'',​ ''​**/​**''​ (умножение,​ деление) 
- * ''​**-**''​ (унарный минус) 
- * ''​**(**[выр]**)**''​ - выражения в скобках 
-  
 Выражения в **QSP** должны удовлетворять следующим условиям:​ Выражения в **QSP** должны удовлетворять следующим условиям:​
  
-  Максимальная вложенность выражений - 30. Т.е. не глубже 30-ти открытых и вложенных друг в друга скобок. +  ​* Максимальная вложенность выражений - 30. Т.е. не глубже 30-ти открытых и вложенных друг в друга скобок. 
-  ​Максимальное количество операций на одном уровне вложенности - 100.+  ​Максимальное количество операций на одном уровне вложенности - 100.
  
 ===== Описание операций ===== ===== Описание операций =====
  
 +==== Правда или Ложь? ====
  
-**Важно!** ​Поскольку в **QSP** нет булевого типа данных,​ истинность или ложность выражения определяется по его числовому значению. Верным считается числовое выражение,​ значение которого отлично от ''​**0**''​. При значении ''​**0**''​ выражение считается ложным. Для значения "​верно"​ настоятельно рекомендуется использовать число ''​**1**'',​ т.к. операции сравнения и логические операции возращают именно это значение в случае истинности выражения.+Поскольку в **QSP** нет булевого типа данных,​ истинность или ложность выражения определяется по его числовому значению. Верным считается числовое выражение,​ значение которого отлично от ''​**0**''​. При значении ''​**0**''​ выражение считается ложным. Для значения "​верно"​ настоятельно рекомендуется использовать число ''​**1**'',​ т.к. операции сравнения и логические операции возвращают именно это значение в случае истинности выражения.
  
-==== Математические операции ====+Начиная с версии 5.9.4 верными так же считаются:​
  
-  ''​**-**[#​выр]''​ - унарный минус. Можно поставить перед числовым выражением и таким образом поменять знак этого выражения на противопложный:<​sxh qsp> +  ​строковые значения, отличные от пустой строки (''​**""​**''​). 
- x = -12 +    * Примеры: <sxh qsp> 
- *pl -x & ! выведет на экран число 12 +if '':​ *pl '​Пустая строка. Надпись ​не увидим.' 
- *pl -(123*12/​-10) +if 'непустая строка': *pl '​Условие выполняется. Надпись увидим.'​
- *pl -10/-5+
 </​sxh>​ </​sxh>​
-  ''​**+**''​ , ''​**-**''​ , ''​*****'',​ ''​**/​**''​ - сложение, вычитание, ​умножение,​ деление ​соответственно.\\ Операции записываются как ''​**[#​выр1] [операция] [#​выр2]**'':<​sxh qsp> +  ​* непустые кортежи, в т.ч. содержащие пустые кортежи. 
- 15+2*5 &! 15+2*5 = 15+10 = 25 +    ​* Примеры:​ <sxh qsp> 
- 15*2+5 &! 15*2+5 = 30+5 = 25 +if []:  ​*pl 'Пустой кортеж. Надпись не увидим.' 
- 15*5/2 &! (15*5)/2 = 75/2 = 37 +if [[]]: *pl 'Не пустой кортеж. Надпись увидим.'
- 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>​ </​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+
  
 +  * В QSP 5.9.3 и ниже: <sxh qsp>
 +loop while $name = '':​
 +  $name = $input('​Введите имя:'​)
 +end
 </​sxh>​ </​sxh>​
- *  ''​[выр1] **<** [выр2]''​ - операция **меньше**. Верно, если значение ​выражения слева меньше значения выражения справа.<sxh qsp> +  ​В QSP 5.9.4 и выше<sxh qsp> 
- *pl 37<56 & ! на экране будет число 1, так как 37 меньше 56 +loop while no $name: 
- *pl 45<23 & ! на экране будет число 0, так как 45 не меньше 23 +  $name = $input('​Введите имя:') 
- *pl 45<45 & ! на экране будет число 0, так как 45 не меньше 45 +end
- +
- if x < y+
- "X меньше Y" +
- elseif y < x: +
- "Y меньше X" +
- else +
- "​Числа равны"​ +
- end+
 </​sxh>​ </​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+  * **''​-[#​выр]''​** - унарный минус. Можно поставить перед числовым выражением и таким образом поменять знак этого выражения на противоположный:​ <sxh qsp> 
- "X больше ​Y" += -12 
- elseif y x: +*pl -x & ! выведет на экран число 12 
- "Y больше X" +*pl -(123*12/​-10) 
- else +*pl -10/-5 
- исла равны" +</sxh> 
- end+  * **''​+''​** , **''​-''​** , **''​*''​**,​ **''/''​** - сложение,​ вычитание,​ умножение,​ деление соответственно.\\ Операции записываются как **''​[#​выр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 на равен 4 
 +10 mod 7 & ! 10/7 = 1 -> 7*1=7  -> 10-7 = 3  -> остаток от деления 10 на 7 равен 3
 </​sxh>​ </​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: +Сравнивать можно данные любых типов. Подробнее ​о сравнении [[help:​strings|строк]] и [[help:​tuples|кортежей]] читайте в соответствующих разделах.
- "X меньше либо равно Y" +
- else +
- "Y меньше X" +
- end+
  
-</​sxh>​ **Примечание.** ​Запись ''​**%%=>%%**''​ редко применяется в других языках программирования,​ поэтому рекомендуем не привыкать к её использованию,​ хотя в **QSP** это ошибкой не будет. +  * **''​[выр1] = [выр2]''​** - операция **равно**. Верно, если значения рядом стоящих выражений равны. Данную операцию не стоит путать с операцией присваивания,​ хотя на первый взгляд они похожи. Чтобы операция **равно** корректно вернула значение,​ она должна быть записана после ключевого слова **''​IF''​**,​ **''​ELSEIF''​**,​ **''​WHILE''​** или в первом аргументе функции **''​IIF''​**,​ или стоять после явного оператора вывода текста вроде **''​*PL''​**,​ или если используется с неявным оператором,​ быть заключённой в скобки. Примеры:​ <sxh qsp> 
-  ''​[выр1] **>=** [выр2], [выр1] **%%=>​%%** [выр2]''​ - операция **больше либо равно**. Верно, если значение выражения слева больше или равно значению выражения справа.<​sxh qsp> +! операция сравнения **равно** с явным указанием оператора перед ней: 
- *pl 37>=56 & ! на экране будет число 0, так как 37 не больше и не равно 56 +*pl 6+12 = 6*3 & ! 6+12 = 6*3 -> 18=18 -> на экране мы увидим число 1, что означает,​ что значения выражений равны 
- *pl 45>=23 & ! на экране будет число 1, так как 45 больше 23 +*pl 226 = 15*15 & ! 226 = 15*15 -> 226=225 -> на экране увидим **0**, так как 226 не равно 225. 
- *pl 45>=45 & ! на экране будет число 1, так как 45 равно 45 +! операция сравнения **равно** с неявным оператором 
- +('​ab'​+'​cd'​ = '​abc'​+'​d'​) & ! на экране увидим 1, так как '​ab'​+'​cd'​ равно '​abc'​+'​d'​ 
- if x >= y: +(13*9 = 19*3) & ! на экране увидим 0, так как 13*9 не равно 19*3 
- "X больше либо равно Y" +! операция сравнения в условии 
- else +if x = y: 
- "Y больше X" +  *pl "​Числа равны"​ 
- end +else 
- +  *pl "​Числа не равны"​ 
-</​sxh>​ **Примечание.** Запись ''​**%%=>​%%**''​ редко применяется в других языках программирования,​ поэтому рекомендуем не привыкать к её использованию,​ хотя в **QSP** это ошибкой не будет.+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** это ошибкой не будет.
  
 ==== Логические операции ==== ==== Логические операции ====
  
-  ''​**OBJ** [$выр]''​ - операция проверки наличия ​предмета в **Инвентаре**. Верно, если в **Окне предметов** ​есть ​предмет ​с названием ''​[$выр]''​.<​sxh qsp> +  ​* ''​**OBJ** [$название]''​ - возвращает число предметов с названием ''​%%[$выр]%%''​. Подробнее в разделе [[help:​objs|Предметы (инвентарь)]] 
- addobj "Отвёртка+  * ''​**LOC** [$выр]''​ - операция проверки наличия ​локации ​в игре. Верно, если в игре есть ​локация ​с названием ''​%%[$выр]%%''​. <sxh qsp> 
- +в игре создана ​локация "Густая чаща" 
- *pl obj "​Отвёртка"​ & ! на экране будет число 1, так как предмет **Отвёртка** есть в окне предметов +*pl loc "Густая чаща" & ! на экране ​мы увидим число ​1 
- *pl obj "Апельсин" &! на экране ​будет число ​0, так как предмета **Апельсин** нет в окне предметов +if loc "Дом":  
- +  *pl "Вы можете войти в дом." 
- if obj "Отвёртка": +else  
- *pl "У вас ​есть отвёртка." +  *pl "Вы не можете войти в дом." 
- else +end
- *pl "У вас ​нет отвёртки." +
- end +
 </​sxh>​ </​sxh>​
-  ''​**LOC** [$выр]''​ - операция ​проверки наличия локации ​в игре. Верно, если в игре есть локация ​с названием ''​[$выр]''​.<​sxh qsp> +  ​* ''​**NO** [$выр]''​ - операция отрицаниялогическое отрицание, или логическая инверсия. Если ​''​%%[#​выр]%%''​ верно, операция ​возвращает **0**, а если ​''​%%[#выр]%%'' ​не верно, операция возвращает **1**Примеры: ​<sxh qsp> 
- в игре создана локация "Густая чаща"​ +*pl no 1 & на экране увидим 0, так как 1 соответвует верному выражению ​ 
- *pl loc "Густая чаща" ​& ! на экране ​мы увидим ​число 1 +*pl no 7 & ! на экране ​увидим 0, так как 7 соответвует верному выражению 
- +*pl no 0 & ! на экране увидим ​1, так как 0 соответствует неверному выражению 
- if loc "Дом": +addobj "​Отвёртка"​ 
- *pl "Вы можете войти в дом." +if no obj "Отвёртка": 
- else +  "У вас нет отвёртки." 
- *pl "Вы не можете войти в дом." +else 
- end+  "У вас ​есть ​отвёртка." 
 +end
 </​sxh>​ </​sxh>​
-  ''​**NO** ​[#​выр]''​ - операция ​отрицания, ​логическое отрицание, ​или логическая инверсия. Если ​''​[#​выр]'' ​верно, операция возвращает **0**, а если ''​[#​выр]'' ​не верно, операция возвращает **1**. Примеры:<​sxh qsp> +  ​* ''​%%[#выр1OR [#​выр2]%%''​ - операция логического "​или"​. Всё выражение ​верноесли хотя бы одна ​из его частей ​верна: ''​%%[#выр1]%%''​ или ''​%%[#выр2]%%''​. Примеры:​ <sxh qsp> 
- *pl no 1 & ! на экране увидим ​0, так как ​1 соответвует верному ​выражению +*pl 1 or 1 & ! на экране увидим ​1, так как обе части выражения равны 1  
- *pl no 7 & ! на экране увидим ​0, так как ​7 соответвует верному выражению +*pl 1 or 0 & ! на экране увидим ​1, так как ​левая часть равна 1  
- *pl no 0 & ! на экране увидим ​1, так как ​0 соответствует неверному ​выражению+*pl 0 or 1 & ! на экране увидим 1, так как правая часть равна 1  
 +*pl 0 or 0 & ! на экране увидим ​0, так как обе части выражения равны 0
  
- addobj "Отвёртка" +! обе части выражения верны, значит и всё выражение верно:​ 
- if no obj "Отвёртка"+(2=2) or (3<>​2) & ! выражение вернёт 1 (правда) 
- "​У ​вас нет отвёртки." +! одна часть выражения верна, значит всё выражение верно
- else +(2<>​2) or (3<>​2) & ! выражение вернёт 1 (правда) 
- "У вас есть отвёртка." +обе части выражения не верны, значит и всё выражение не верно:​ 
- end+(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
  
-</​sxh>​ +! обе части выражения верны, значит и всё выражение верно:​ 
- *  ''​[#​выр1] **OR** [#​выр2]''​ - операция логического "​или"​. Всё выражение верно, если хотя бы одна из его частей верна: ''​[#​выр1]''​ или ''​[#​выр2]''​. Примеры:<​sxh qsp> +(2=2) and (3<>​2) & ! выражение вернёт 1 (правда) 
- *pl 1 or 1 & ! на экране увидим 1, так как обе части выражения равны 1 +! одна часть выражения не верна, значит всё выражение неверно: 
- *pl 1 or 0 & ! на экране увидим 1, так как левая часть равна 1 +(2<>​2) and (3<>​2) & ! выражение вернёт 0 (ложь) 
- *pl 0 or 1 & ! на экране увидим 1, так как правая часть равна 1 +! обе части выражения не верны, значит и всё выражение не верно: 
- *pl 0 or 0 & ! на экране увидим 0, так как обе части выражения равны 0 +(2<>​2) and (3=2) & ! выражение вернёт 0 (ложь) 
- +</​sxh>​ Если ''​[#​выр1]''​ не верно, значение ''​[#​выр2]''​ не вычисляется.
- ! обе части выражения верны, значит и всё выражение верно +
- (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]''​ не вычисляется.+
  
 ==== Операции со строками ==== ==== Операции со строками ====
  
- *  ''​[$выр1] **&** [$выр2]''​ - операция объединения строковых выражений. Подробнее см. [[help:​strings|Строки]]. Не путайте с символом перечисления команд. Примеры:<​sxh qsp> +Операции ​сравнения строка так же функции для работы ​со строками описаны в разделе [[help:​strings|Строки]].
- ! в данном случае на экран будут последовательно выведены строки ​"​26" ​и "​27"​ +
- "​26"​ & "​27"​ +
- ! в данном ​случае на экран будет выведена строка "​2627"​ +
- ("​26"​ & "​27"​)+
  
-</​sxh>​ Во избежание путаницы,​ для объединения строк используйте операцию ''​**+**'',​ она работает точно так же. +  * ''​%%([$выр1] & [$выр2])%%''​ - операция объединения строковых выражений (конкатенация). Не путайте с символом перечисления команд. Примеры:​ <sxh qsp> 
-  ''​[$выр1] ​**+** [$выр2]''​ - операция объединения строковых выражений. Подробнее см. [[help:​strings|Строки]]. Примеры:<​sxh qsp> +! в данном случае на экран будут последовательно выведены строки "​26"​ и "​27"​ 
- ! в данном случае на экран будет выведена строка "​2627"​ +"​26"​ & "​27"​ 
- "​26"​ + "​27"​+! в данном случае на экран будет выведена строка "​2627"​ 
 +("​26"​ & "​27"​) 
 +</​sxh>​ Во избежание путаницы,​ для объединения строк используйте операцию ''​%%+%%'',​ она работает точно так же. При попытке конкатенации двух числовых значений они преобразуются в строку
 +  ​''​%%[$выр1] + [$выр2]%%''​ - операция объединения строковых выражений. Примеры:​ <sxh qsp> 
 +! в данном случае на экран будет выведена строка "​2627"​ 
 +"​26"​ + "​27"​
 </​sxh>​ </​sxh>​
  
-===== Другие ​примеры =====+==== Операции с кортежами ​====
  
 +Другие операции и функции для работы с кортежами представлены в разделе [[help:​tuples|Кортежи]].
  
-<sxh qsp> +  * ''​([%выр1] **&** [%выр2])''​ - операция объединения кортежей ​(конкатенация). Не путайте с символом перечисления команд. Примеры:​ <sxh qsp> 
-x=5 +в данном случае на экран будут последовательно выведены кортежи [26, 27] и [37, 48] 
-y=6 +[26, 27] [37, 48] 
-(x ! yOR (x <> y) &! Результат ​1 +в данном случае на экран будет выведен кортеж [26, 27, 37, 48] 
-x OR y &Результат ​1 +([26, 27] [37, 48]) 
-x AND y &​! ​Результат 1 +</sxh> 
-y MOD x &! 6/5 -> остаток ​1 Результат 1 +  * ''​[%выр1] **+** [выр2]''​ - операция увеличения значений кортежа. К каждому элементу ​кортежа ''​%%%выр1%%''​ будет прибавлен элемент ''​%%выр2%%''​. ''​%%выр2%%''​ может быть кортежем, тогда каждый элемент ''​%%%выр1%%'' будет ​сложен с кортежем ''​%%%выр2%%''​. Примеры:​ <sxh qsp> 
-OBJ '​стул' &​! ​Если ​в инвентаре есть предмет 'стул', ​то результат 1, если нет, то 0 +%tuple = [4, 10, 16] 
-LOC 'дом' &​! ​Если в игре ​есть локация ​ом', ​то результат ​1, если нетто 0 +%a = %tuple + 2 
-res x*y + y*-x/2 &​! ​(5*6) + (6*(-5)/2)=15  ​-> в res запишется число ​15 +! %a будет равно [6, 12, 18] 
-res = NO x = y &! NO 5 = 6 -> NO 0 -> в res запишется число 1 +[4, 10] + ['​b',​ 'x'& ! [4 + ['​b',​ '​x'​],​ 10 + ['​b',​ '​x'​]] ! [['​4b','​4x'​],​ ['​10b','​10x'​]] 
 +</​sxh>​ 
 +  * ''​[%выр1] **-** [#​выр2]''​ - операция уменьшения значений кортежа. Из каждого элемента кортежа ''​%%%выр1%%''​ будет вычтен элемент ''​%%#​выр2%%''​. ''​%%#​выр2%%''​ может быть только числом. Все остальные варианты приведут к ошибке о несоответствии типов данных. Примеры: <sxh qsp> 
 +%tuple = [410, 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>​ </​sxh>​
  
-===== Операции с присваиванием ====+==== Операции с присваиванием ====
-[:​sokraschennye_operacii_s_prisvoeniem]+
  
 Помимо обыкновенной [[help:​variables|операции присваивания]] в **QSP** существуют так же совмещённые математические операции с присваиванием. Помимо обыкновенной [[help:​variables|операции присваивания]] в **QSP** существуют так же совмещённые математические операции с присваиванием.
  
- * ''​**+=**''​ — операция "​сложение с присваиванием",​ сочетающая в себе операции присваивания и сложения. Прибавляет к текущему значению переменной указанное значение. Общая запись:<​sxh qsp> +  ​* ''​%%+=%%''​ — операция "​сложение с присваиванием",​ сочетающая в себе операции присваивания и сложения. Прибавляет к текущему значению переменной указанное значение. Общая запись:​ <sxh qsp> 
- имя_переменной+=[выражение] +имя_переменной += [выражение] 
-</​sxh>​ Эквивалентно конструкции:<​sxh qsp> +</​sxh>​ Эквивалентно конструкции:​ <sxh qsp> 
- имя_переменной=имя имя_переменной+[выражение] +имя_переменной = имя имя_переменной + [выражение] 
-</​sxh>​ Пример:<​sxh qsp> +</​sxh>​ Пример:​ <sxh qsp> 
- ! мы заменяем две операции:​ присвоения и сложения +! мы заменяем две операции:​ присвоения и сложения 
- warrior=warrior+15 +warrior = warrior+15 
- ! на одну (действие аналогично) +! на одну (действие аналогично) 
- warrior+=15 +warrior += 15 
-</​sxh>​ Примечание:​ данную операцию можно использовать и для склейки строк. При этом строка "​приклеивается в конец уже существующей строки":<​sxh qsp> +</​sxh>​ Примечание:​ данную операцию можно использовать и для склейки строк. При этом строка "​приклеивается в конец уже существующей строки":​ <sxh qsp> 
- $text='​Вечное слово в остывшей'​ +$text = '​Вечное слово в остывшей'​ 
- $text+='​ золе...'​+$text += ' золе...'​
 </​sxh>​ </​sxh>​
- * ''​**-=**''​ — операция "​вычитание с присваиванием",​ сочетающая в себе операции присваивания и вычитания. Вычитает из текущего значения переменной указанное значение. Общая запись:<​sxh qsp> +  ​* ''​%%-=%%''​ — операция "​вычитание с присваиванием",​ сочетающая в себе операции присваивания и вычитания. Вычитает из текущего значения переменной указанное значение. Общая запись:​ <sxh qsp> 
- имя_переменной-=[#​выражение] +имя_переменной -= [#​выражение] 
-</​sxh>​ Эквивалентно конструкции:<​sxh qsp> +</​sxh>​ Эквивалентно конструкции:​ <sxh qsp> 
- имя_переменной=имя имя_переменной-[#​выражение] +имя_переменной = имя имя_переменной - [#​выражение] 
-</​sxh>​ Пример:<​sxh qsp> +</​sxh>​ Пример:​ <sxh qsp> 
- ! мы заменяем две операции:​ присвоения и вычитания +! мы заменяем две операции:​ присвоения и вычитания 
- warrior=warrior-15 +warrior = warrior - 15 
- ! на одну (действие аналогично) +! на одну (действие аналогично) 
- warrior-=15+warrior -= 15
 </​sxh>​ </​sxh>​
- * ''​**/=**''​ — операция "​деление с присваиванием",​ сочетающая в себе операции присваивания и деления. Делит текущее значение переменной на указанное значение. Общая запись:<​sxh qsp> +  ​* ''​%%/=%%''​ — операция "​деление с присваиванием",​ сочетающая в себе операции присваивания и деления. Делит текущее значение переменной на указанное значение. Общая запись:​ <sxh qsp> 
- имя_переменной/​=[#​выражение] +имя_переменной /= [#​выражение] 
-</​sxh>​ Эквивалентно конструкции:<​sxh qsp> +</​sxh>​ Эквивалентно конструкции:​ <sxh qsp> 
- имя_переменной=имя имя_переменной/​[#​выражение] +имя_переменной = имя имя_переменной / [#​выражение] 
-</​sxh>​ Пример:<​sxh qsp> +</​sxh>​ Пример:​ <sxh qsp> 
- ! мы заменяем две операции:​ присвоения и деления +! мы заменяем две операции:​ присвоения и деления 
- warrior=warrior/​2 +warrior = warrior / 2 
- ! на одну (действие аналогично) +! на одну (действие аналогично) 
- warrior/=2+warrior /= 2
 </​sxh>​ </​sxh>​
- * ''​***=**''​ — операция "​умножение с присваиванием",​ сочетающая в себе операции присваивания и умножения. Умножает текущее значение переменной на указанное значение. Общая запись:<​sxh qsp> +  ​* ''​%%*=%%''​ — операция "​умножение с присваиванием",​ сочетающая в себе операции присваивания и умножения. Умножает текущее значение переменной на указанное значение. Общая запись:​ <sxh qsp> 
- имя_переменной*=[#​выражение] +имя_переменной *= [#​выражение] 
-</​sxh>​ Эквивалентно конструкции:<​sxh qsp> +</​sxh>​ Эквивалентно конструкции:​ <sxh qsp> 
- имя_переменной=имя имя_переменной*[#​выражение] +имя_переменной = имя имя_переменной * [#​выражение] 
-</​sxh>​ Пример:<​sxh qsp> +</​sxh>​ Пример:​ <sxh qsp> 
- ! мы заменяем две операции:​ присвоения и умножения +! мы заменяем две операции:​ присвоения и умножения 
- warrior=warrior*2 +warrior = warrior * 2 
- ! на одну (действие аналогично) +! на одну (действие аналогично) 
- warrior*=2+warrior *= 2 
 +</​sxh>​ 
 + 
 +Операции с присваиванием применимы и к кортежам. В этом случае кортежи изменяются по такому же принципу,​ как в операциях ''​%%+%%'',​ ''​%%-%%'',​ ''​%%/​%%'',​ ''​%%*%%''​. 
 + 
 +==== Другие примеры ==== 
 + 
 +<sxh qsp> 
 +x = 5 
 +y = 6 
 +(x ! y) OR (x <> y)  &! Результат 1 
 +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|Вперёд:​ Программный код]]
  
help/expressions.1672490358.txt.gz · Последние изменения: 2022/12/31 12:39 — aleks_versus