Здесь показаны различия между двумя версиями данной страницы.
msx:basic_programming_guide:03 [2019-11-02 11:40] |
msx:basic_programming_guide:03 [2020-03-21 22:52] |
||
---|---|---|---|
Строка 48: | Строка 48: | ||
* n — любой существующий номер строки в программе, 0≤n≤65529. | * n — любой существующий номер строки в программе, 0≤n≤65529. | ||
- | Оператор ''GOTO'' передаёт управление программной строке с указанным номером n. Если в программе нет строки с этим номером, то выдаётся сообщение: \\ <WRAP centeralign>"Undefined line number" \\ (//"Номер строки не определён"//).</WRAP> | + | Оператор ''GOTO'' передаёт управление программной строке с указанным номером n. Если в программе нет строки с этим номером, то выдаётся сообщение: <WRAP centeralign>"Undefined line number" \\ (//"Номер строки не определён"//).</WRAP> |
Управление передаётся заданной строке, даже если в ней нет выполняемого оператора; например, в строке может находиться оператор ''REM''. Поскольку, однако, оператор ''REM'' не исполняется, лучше передавать управление следующему за ним исполняемому оператору. В этом случае программа будет выполняться правильно и после удаления программной строки, содержащей комментарии. | Управление передаётся заданной строке, даже если в ней нет выполняемого оператора; например, в строке может находиться оператор ''REM''. Поскольку, однако, оператор ''REM'' не исполняется, лучше передавать управление следующему за ним исполняемому оператору. В этом случае программа будет выполняться правильно и после удаления программной строки, содержащей комментарии. | ||
Строка 259: | Строка 259: | ||
Напомним, что //семантика// (от греч."semantikos" — "обозначающий") — значения единиц языка, а //синтаксис// (от греч."syntaxis" — "построение,порядок") — способы соединения слов (и их форм) в словосочетания, предложения и текст. | Напомним, что //семантика// (от греч."semantikos" — "обозначающий") — значения единиц языка, а //синтаксис// (от греч."syntaxis" — "построение,порядок") — способы соединения слов (и их форм) в словосочетания, предложения и текст. | ||
- | Опишем семантику конструкции ''IF…THEN…ELSE… ''. Вначале вычисляется значение условия. Если в качестве условия записано строковое выражение, то выдаётся сообщение об ошибке: \\ <WRAP centeralign>"Type mismatch" \\ (//"Несоответствие типов"//).</WRAP> | + | Опишем семантику конструкции ''IF…THEN…ELSE… ''. Вначале вычисляется значение условия. Если в качестве условия записано строковое выражение, то выдаётся сообщение об ошибке: <WRAP centeralign>"Type mismatch" \\ (//"Несоответствие типов"//).</WRAP> |
Если условие истинно (TRUE), то управление передаётся фразе ''THEN''; если условие ложно (''FALSE'') и есть фраза ''ELSE'', то управление передаётся фразе ''ELSE''; если условие ложно (''FALSE'') и нет фразы ''ELSE'', то управление передаётся первому оператору //следующей// программной строки (то есть условно можно считать, что фраза ''ELSE'' есть, но за ней стоит "пустой" оператор, не производящий никаких действий). | Если условие истинно (TRUE), то управление передаётся фразе ''THEN''; если условие ложно (''FALSE'') и есть фраза ''ELSE'', то управление передаётся фразе ''ELSE''; если условие ложно (''FALSE'') и нет фразы ''ELSE'', то управление передаётся первому оператору //следующей// программной строки (то есть условно можно считать, что фраза ''ELSE'' есть, но за ней стоит "пустой" оператор, не производящий никаких действий). | ||
Строка 662: | Строка 662: | ||
Если p=0 или p>k, то выполняется оператор, следующий за ''ON''. | Если p=0 или p>k, то выполняется оператор, следующий за ''ON''. | ||
- | Если же p<0, то последует сообщение об ошибке: \\ <WRAP centeralign>"Illegal function call" \\ (//"Неправильный вызов функции"//).</WRAP> | + | Если же p<0, то последует сообщение об ошибке: <WRAP centeralign>"Illegal function call" \\ (//"Неправильный вызов функции"//).</WRAP> |
__//Примеры//__: | __//Примеры//__: | ||
Строка 1304: | Строка 1304: | ||
</WRAP> | </WRAP> | ||
- | Как уже говорилось, тело цикла может содержать второй цикл — //внутренний// по отношению к первому, //внешнему// циклу ("бумажные стаканчики"). Внутренний цикл должен целиком содержаться в теле внешнего цикла. Таким образом, оператор ''NEXT'' для внутреннего цикла должен стоять перед оператором ''NEXT'' внешнего цикла. Нарушение этого правила приводит к появлению на экране сообщения об ошибке: \\ <WRAP centeralign>"NEXT without FOR in ..." \\ (//"Оператор NEXT без оператора FOR в строке …"//).</WRAP> | + | Как уже говорилось, тело цикла может содержать второй цикл — //внутренний// по отношению к первому, //внешнему// циклу ("бумажные стаканчики"). Внутренний цикл должен целиком содержаться в теле внешнего цикла. Таким образом, оператор ''NEXT'' для внутреннего цикла должен стоять перед оператором ''NEXT'' внешнего цикла. Нарушение этого правила приводит к появлению на экране сообщения об ошибке: <WRAP centeralign>"NEXT without FOR in ..." \\ (//"Оператор NEXT без оператора FOR в строке …"//).</WRAP> |
{{anchor:e034-20}} __//Пример//__. \\ {{.examples:034-20.bas|}} \\ [[+tab|wmsxbpge>034-20.bas]] | {{anchor:e034-20}} __//Пример//__. \\ {{.examples:034-20.bas|}} \\ [[+tab|wmsxbpge>034-20.bas]] | ||
Строка 1321: | Строка 1321: | ||
Учтите, что каждый оператор ''FOR…NEXT'' занимает при работе 25 байтов //стека//, причём стек освобождается только при завершении цикла, после последнего выполнения оператора ''NEXT''! | Учтите, что каждый оператор ''FOR…NEXT'' занимает при работе 25 байтов //стека//, причём стек освобождается только при завершении цикла, после последнего выполнения оператора ''NEXT''! | ||
- | Тем не менее, если программа использует слишком много циклов одновременно, может возникнуть сообщение об ошибке: \\ <WRAP centeralign>"Out of memory" \\ (//"Выход за пределы памяти"//).</WRAP> | + | Тем не менее, если программа использует слишком много циклов одновременно, может возникнуть сообщение об ошибке: <WRAP centeralign>"Out of memory" \\ (//"Выход за пределы памяти"//).</WRAP> |
Если требуется, чтобы несколько вложенных операторов ''FOR'' заканчивались в одном месте, можно использовать один оператор ''NEXT'', содержащий список параметров циклов, разделённых запятыми: первое имя в списке соответствует самому внутреннему, последнее — самому внешнему циклу. | Если требуется, чтобы несколько вложенных операторов ''FOR'' заканчивались в одном месте, можно использовать один оператор ''NEXT'', содержащий список параметров циклов, разделённых запятыми: первое имя в списке соответствует самому внутреннему, последнее — самому внешнему циклу. | ||
Строка 1382: | Строка 1382: | ||
</WRAP> | </WRAP> | ||
- | Операторы ''FOR'' и ''NEXT'', как правило, должны идти в паре и быть согласованы друг с другом. Если оператор ''NEXT'' выполняется раньше оператора ''FOR'' с тем же параметром цикла, то при выполнении такого ''NEXT'' выдаётся сообщение об ошибке: \\ <WRAP centeralign>"NEXT without FOR" \\ //("Нет оператора FOR для данного NEXT"//).</WRAP> | + | Операторы ''FOR'' и ''NEXT'', как правило, должны идти в паре и быть согласованы друг с другом. Если оператор ''NEXT'' выполняется раньше оператора ''FOR'' с тем же параметром цикла, то при выполнении такого ''NEXT'' выдаётся сообщение об ошибке: <WRAP centeralign>"NEXT without FOR" \\ //("Нет оператора FOR для данного NEXT"//).</WRAP> |
Оператор ''FOR…NEXT'' — единственный способ в [[msx:basic:]] для изменения естественного порядка выполнения операторов без задания номеров программных строк, на которые нужно перейти. | Оператор ''FOR…NEXT'' — единственный способ в [[msx:basic:]] для изменения естественного порядка выполнения операторов без задания номеров программных строк, на которые нужно перейти. | ||
Строка 2488: | Строка 2488: | ||
- | {{tag>MSX BASIC Book}} | + | {{tag>MSX BASIC Book_msxbpg}} |