Здесь показаны различия между двумя версиями данной страницы.
Both sides previous revision Предыдущая версия Следущая версия | Предыдущая версия | ||
help:conditional [2025/09/28 10:39] aleks_versus [Условия] |
help:conditional [2025/09/28 18:37] (текущий) aleks_versus [Проблема висячего else] |
||
---|---|---|---|
Строка 5: | Строка 5: | ||
Условия — это такие особые конструкции в **QSP**, которые позволят сделать вашу игру по настоящему интерактивной. Они позволяют разветвлять события, происходящие в игре в зависимости от уже сложившихся условий, и таким образом вносить разнообразие в игровой процесс. Операторы, которые используются в конструкциях условий, в программировании называются **операторами ветвления**. | Условия — это такие особые конструкции в **QSP**, которые позволят сделать вашу игру по настоящему интерактивной. Они позволяют разветвлять события, происходящие в игре в зависимости от уже сложившихся условий, и таким образом вносить разнообразие в игровой процесс. Операторы, которые используются в конструкциях условий, в программировании называются **операторами ветвления**. | ||
- | Операторы ветвления часто используют с [[help:expression|операциями сравнения и с логическими операциями]]. | + | Операторы ветвления часто используют с [[help:expressions|операциями сравнения и с логическими операциями]]. |
===== Операторы условий ===== | ===== Операторы условий ===== | ||
Строка 265: | Строка 265: | ||
! эквивалентно | ! эквивалентно | ||
*pl $iif(number mod 2 = 0,"Число чётное","Число не чётное") | *pl $iif(number mod 2 = 0,"Число чётное","Число не чётное") | ||
+ | </sxh> | ||
+ | |||
+ | ===== Проблема висячего ELSE ===== | ||
+ | |||
+ | Если вы часто пользуетесь однострочными конструкциями условий, вы неизбежно столкнётесь с "проблемой висячего ELSE". Это ситуация, когда невозможно однозначно трактовать, к какому ''IF'' относится ''ELSE''. Вот пример подобной неоднозначности: | ||
+ | |||
+ | <sxh qsp> | ||
+ | if first: if second: 'when true' else: 'when false' | ||
+ | </sxh> | ||
+ | |||
+ | Сложно с ходу понять, к какому из ''IF'' — первому или второму — относится ''ELSE''. | ||
+ | |||
+ | К счастью данная неоднозначность в QSP разрешается, как и во многих других языках программирования. ''ELSE'' всегда относится к ближайшему ''IF'' без ''ELSE''. То есть в данном случае ко второму. Вышеприведённая однострочная конструкция может быть представлена таким многострочным эквивалентом: | ||
+ | |||
+ | <sxh qsp> | ||
+ | if first: | ||
+ | if second: | ||
+ | 'when true' | ||
+ | else: | ||
+ | 'when false' | ||
+ | end | ||
+ | end | ||
+ | </sxh> | ||
+ | |||
+ | Из этого правила вытекает возможность создавать вот такие конструкции, где у каждого ''IF'' есть свой ''ELSE'': | ||
+ | |||
+ | <sxh qsp> | ||
+ | if first: if second: 'when true' else: 'when false' else 'first false' | ||
+ | </sxh> | ||
+ | |||
+ | А вот создать эквивалент такой многострочной конструкции в однострочной форме так просто не получится: | ||
+ | |||
+ | <sxh qsp> | ||
+ | if first: | ||
+ | if second: | ||
+ | 'when true' | ||
+ | end | ||
+ | else: | ||
+ | 'when false' | ||
+ | end | ||
+ | </sxh> | ||
+ | |||
+ | Хотя, если //очень// нужно... | ||
+ | |||
+ | <sxh qsp> | ||
+ | if first: dynamic {if second:'when true'} else: 'when false' | ||
+ | if first: if second: 'when true' else: args=args else: 'when false' | ||
</sxh> | </sxh> | ||
[[help:organizing|Вперёд: Пользовательские функции и процедуры]] | [[help:organizing|Вперёд: Пользовательские функции и процедуры]] | ||