Управляющие конструкции
Ниже описаны управляющие конструкции, которые поддерживаются в Tibbo BASIC и Tibbo C. В управляющих конструкциях используются операторы сравнения и логические операторы.
if - then - else
Tibbo BASIC поддерживает два разных варианта конструкции if-then-else: однострочный и многострочный.
Однострочный вариант - единственная конструкция во всём Tibbo BASIC/C, которая обязана целиком помещаться на одной строке текста.
if x>10 then s="Over the limit" x=10 else s="Within limit" 'notice how there are two statements for when x>10. This is totally OK!
if x>10 then s="Over the limit" : x=10 else s="Within limit" 'you may separate multiple statements with a colon; this is for your convenience -- TIDE doesn't care
В C, разумеется, тоже есть свой «однострочный» if-then-else, в котором даже нет ключевых слов if, then и else. Слово однострочный здесь в кавычках, потому что C переводы строк по сути безразличны. Просто растягивать эту конструкцию на несколько строк странно.
x=y<z ? y : z;
Многострочный вариант if-then-else в Tibbo BASIC и C похож:
if x=0 then
s="At zero"
sys.debugprint("x=0")
else if x=1 then
s="At one"
else
s="Other value"
end if
if(x==0){
s="At zero";
sys.debugprint("x=0");
}
else if(x==1)
s="At one";
else
s="Other value";
select case / switch()
Различия между Tibbo BASIC и Tibbo C:
- В BASIC не нужно завершать каждый case оператором break. В C это обязательно!
- Чтобы в BASIC объединить несколько значений в одном case, используйте такой синтаксис: case 2,3. Если написать case 2: case 3:, это будет означать, что в case 2 нет кода (пустой case). В C - ровно наоборот.
- Конструкция switch в C гораздо эффективнее. Она реализована как «таблица переходов», а select case в BASIC перебирает каждый case: по очереди. С другой стороны, BASIC позволяет задавать case с непостоянным значением (например, case 1+y:). В C это вызовет ошибку - допускаются только константные выражения! Причина в том, что таблица переходов строится при компиляции.
select case x
case 0:
s="At zero"
case 1+y: 'comparison with a non-constant expression
s="At one"
case 2,3: 'this is how you combine several values in one case
s="At two or three"
case 4: 'no code -- this is NOT combined with "case else", this is a separate case
case else:
s="At something else"
end select
switch(x){
case 0:
s="At zero"; break;
case 1:
s="At one"; break;
case 2: //this is how you combine several values in one case
case 3:
s="At two or three"; break;
case 4:
break;
default:
s="At something else"; break;
}
for - next / for()
Циклы в Tibbo BASIC «включают последнее значение». Если написать for f=0 to 4, цикл выполнится пять раз (при step=1).
Рассмотрим два примера: простой цикл с шагом 1 и цикл с заданным шагом.
'simple for-next with increment by 1
for f=0 to 4
sys.debugprint(str(f))
sys.debugprint("\x0A\x)D")
next f
'for-next with custom step; f must be a char (signed variable) for this to work properly
for f=10 to 0 step -2
sys.debugprint(str(f)+" ")
next f
//increment by 1
for(f=0;f<=4;f++){
sys.debugprint(str(f));
sys.debugprint("\x0A\x0D");
}
//step=-2; f must be a char (signed variable) for this to work properly
for(f=10;f>=0;f-=2)
sys.debugprint(str(f)+chr(10)+chr(13));
do - loop / do - while()
В BASIC у этой конструкции четыре варианта: do until - loop, do - loop until, do while - loop, do - loop while.
Проверка условия в начале работает иначе, чем в конце: do until - loop и do while - loop могут не выполниться ни разу, а do - loop until и do - loop while всегда проходят цикл хотя бы один раз.
В C у этой конструкции только одна форма: do - while(). Поскольку проверка стоит в конце, такой цикл всегда выполняется хотя бы один раз.
'do until--loop
f=0
do until f=10
f=f+1
loop
'do--loop until
f=0
do
f=f+1
loop until f=10
'do while--loop
f=0
do while f<11
f=f+1
loop
do--loop while
f=0
do
f=f+1
loop while f<11
f=0;
do{
sys.debugprint(str(f)+" ");
f=f+1;
}while(f<11);
while - wend / while()
Реализации в BASIC и C идентичны. Проверка стоит в начале, поэтому цикл может не выполниться ни разу.
f=0
while f<11
f=f+1
wend
f=0;
while(f<11){
f=f+1;
}
exit for, exit do, exit while (Tibbo BASIC) и break (Tibbo C)
В BASIC операторы exit for, exit do и exit while прерывают текущий цикл for - next, do - loop/while или while-wend.
В C оператор break прерывает текущий цикл for, do - loop и while.
Операторы Exit и break завершают только «свой» цикл. Внешние циклы они не затрагивают:
'Go through each row of a two-dimensional array until the 'A' character is encountered
for f=0 to 1
for f2=0 to 5
if arr(f,f2)=`A` then
exit for
end if
next f2
next f
//Go through each row of an array until the 'A' character is encountered
for(f=0;f<10;f++){
for(f2=0;f2<10;f2++){
if(arr[f][f2]=='A'){
break; //will only break out of the inner "f2" loop
}
}
}
В C оператор break используется и в конструкции switch. Более того, он её неотъемлемая часть (см. пример выше).
exit sub и exit function (Tibbo BASIC)
Exit sub и Exit function позволяют завершить выполнение процедуры/функции в любом месте её тела.
В C аналог - оператор return, но использовать его так можно только в функциях, возвращающих значение (не void).
sub process_command(cmd as string)
if cmd="" then
exit sub
end if
...
...
end sub
function create_file(file_name as string) as boolean
create_file=false
if fd.format(1000,16)<>PL_FD_STATUS_OK then exit function
if fd.mount<>PL_FD_STATUS_OK then exit function
if fd.create("file_name")<>PL_FD_STATUS_OK then exit function
create_file=true
end function
bool create_file(string file_name){
if(fd.format(1000,16)!=PL_FD_STATUS_OK)
return false;
if(fd.mount()!=PL_FD_STATUS_OK)
return false;
if(fd.create("file_name")!=PL_FD_STATUS_OK)
return false;
return true;
}
continue (Tibbo C)
В конструкциях For, do - loop и while языка C можно также использовать оператор continue. Он пропускает остаток тела цикла и сразу переходит к следующему проходу.
В Tibbo BASIC аналога нет.
//Divide each element in an array by 2, but only if this division will have no remainder.
//This example is somewhat artificial -- the same result could be achieved without using the continue statement.
for(f=0;f<10;f++){
if(arr[f]&0x01)
continue;
arr[f][f2]/=2;
}
goto
Некоторые утверждают, что ни одному здравомыслящему языку (или разработчику) оператор goto не нужен никогда. И всё же скромный goto существует и никуда не девается.
В Tibbo BASIC и Tibbo C метки должны заканчиваться двоеточием (:), иначе они не будут распознаны как метки. Это относится только к месту, где метка поставлена, а не к самому оператору goto.
sub process_data
if data_len=0 then goto error_handling
if incoming_data(0)<>`S` then goto error_handling
...
...
...
...
exit sub
error_handling: 'here when something is wrong
...
end sub
void process_data1(){
if(data_len==0)
goto error_handling;
if(incoming_data[0]!='S')
goto error_handling;
...
...
goto exit;
error_handling: //here when something is wrong
...
exit:
}
Область видимости метки ограничена процедурой (функцией), в которой она находится, поскольку оператором goto нельзя перейти из одной процедуры в другую.
Следовательно, одно и то же имя метки можно использовать в нескольких процедурах.