Оператор безусловного перехода goto.
Оператор goto обеспечивает безусловный переход на указанную метку в переделах функции.
Синтаксис: goto m1;
Метка с программе записывается в начале строки и отделяется от операторов двоеточием. Например:
{
func1();
goto m1;
func2(); // Никогда не выполняется
m1: func3();
}
В сочетании с оператором if (рассмотренным ниже) оператор goto может осуществлять условный переход на определённую метку:
if(a==5)
goto m2;
В соответствии с принципами структурного программирования, применение оператора goto считается дурным тоном. Тем не менее в исключительных случаях (в программах со множественным вложением условных операторов) его применение может значительно сократить размер кода и улучшить его читаемость.
Множественный выбор. Операторы switch-case.
Операция условия и конструкция if-else облегчают написание программ, в которых осуществляется выбор между двумя вариантами.
Однако иногда в программе необходимо произвести выбор одного из нескольких вариантов. Мы можем это сделать, используя конструкцию if-else if-else, и т.д., но во многих случаях оказывается более удобным применять оператор switch.
Синтаксис:
switch (целое выражение)
{
case метка1:
[Операторы;] (необязат.)
case метка2:
[Операторы;] (необязат.)
… . . . .
[default: операторы;]
}
Оператор switch вычисляет целое выражение в круглых скобках и сравнивает это значение со всеми значениями (метками), перечисленными с помощью ключевых слов case. Каждая метка должна быть либо целой константой, либо символьной константой, либо константным выражением. Как только значение вычисляемого выражения совпадает с какой-либо меткой, управление передаётся на оператор, следующий за меткой.
Если ни одна из меток не подходит, то управление передается оператору с меткой default (если такой имеется). В противном случае управление передается оператору, следующему за оператором switch.
Как выражения, так и метки должны иметь значения целого типа (включая тип char).
Пример:
switch (letter)
{
case ‘a’:
case ‘A’: printf (“Это буква a (большая или маленькая)”, letter);
break;
case 66: // 66 – код буквы B
printf (“Это буква B (большая)”, letter);
break;
case 0x30+2: //0x30+2 – код цифры 2
printf (“Это цифра 2”, letter);
break;
default: printf (“А вот не знаю я что это за символ”);
}
В отличие от других языков (например Pascal) в С в операторе switch-case после выполнения оператора или группы операторов, следующих за соответствующим условию case выполнение оператора не прекращается, а продолжается до конца оператора switch, выполняя все инструкции, написанные для других case. Это позволяет записывать несколько последовательных меток для одной и той же группы операторов. В этом случае она будет выполняться если значение выражения равно хотя бы одной из меток (см. пример выше).
Если же в программе не требуется выполнение последующих операторов, то прервать выполнение можно с помощью оператора break. Оператор break прерывает выполнение программы внутри тела оператора switch (а также for, while и do) и передаёт управление следующему после switch оператору:
switch (l)
{
case ‘a’: func1(); // Эта функция вызывается только в случае l=’a’
case ‘b’: func2(); // А эта - в случае l=’a’ или l=’b’
break;
case ‘c’: func3(); // Эта функция вызывается только в случае l=’c’
}
Поскольку в большинстве случаев требуется выполнение только одной группы операторов для каждого case, то тело оператора switch обычно состоит из набора блоков начинающихся с выражения “case XX:” и заканчивающегося оператором break.
Как и в других блоках операторов, внутри switch можно определять переменные:
switch (letter)
{
int l;
case ‘a’: l=
printf(“%d”,l);
break;
case ‘A’: l=2;
printf(“%d”,l);
break;
}
Обычно этого не делают, т.к. это ухудшает удобочитаемость программы.
Каковы ограничения использования оператора switch. Его нельзя использовать для работы со стрингами, значениями с плавающей точкой. В метках case нельзя использовать переменные, а также в них нельзя применять интервалы (как это можно сделать, например в Basic). В этих случаях нужно применять конструкции if-else:
if (f==3.5)
printf(“f=3.5”);
else
if(f>4 && f<6)
printf(“4<f<6”) ;
OLE и DDE. Связывание и внедрение данных в документы.
Лекция оле