Управляющие конструкции

Ниже описаны управляющие конструкции, которые поддерживаются в 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 нельзя перейти из одной процедуры в другую.

Следовательно, одно и то же имя метки можно использовать в нескольких процедурах.

Исходный материал Tibbo обновлён 12 июля 2022Оригинал на docs.tibbo.com · Сообщить об ошибке