Здесь показаны различия между двумя версиями данной страницы.
| 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|Вперёд: Пользовательские функции и процедуры]] | ||