Опубликован: 10.10.2006 | Уровень: специалист | Доступ: платный
Лекция 3:

Выражения и операторы

3.3 Сводка операторов

Здесь дается сводка операторов и несколько примеров.

------------------------------------------------------------------
Синтаксис операторов
------------------------------------------------------------------

  оператор:
описание
{ список-операторов opt }
выражение opt ;

if ( выражение )  оператор
if ( выражение )  оператор else оператор
switch ( выражение ) оператор

while ( выражение ) оператор
do  оператор  while ( выражение )
for (начальный-оператор-for; выражение opt; выражение opt) оператор

case  выражение-константа : оператор
default : оператор
break ;
continue ;

return  выражение opt ;

goto  идентификатор ;
идентификатор : оператор

список-операторов:
 оператор
 список-операторов  оператор

начальный-оператор-for:
 описание
 выражение opt ;
----------------------------------------------------------------------

Обратите внимание, что описание является оператором, но нет операторов присваивания или вызова функции (они относятся к выражениям).

3.3.1 Выбирающие операторы

Значение можно проверить с помощью операторов if или switch:

if ( выражение )  оператор

  if ( выражение )  оператор  else  оператор

  switch  ( выражение )  оператор

В языке С++ среди основных типов нет отдельного булевского (тип со значениями истина, ложь). Все операции отношений:

==   !=   <   >   <=   >=

дают в результате целое 1, если отношение выполняется, и 0 в противном случае. Обычно определяют константы TRUE как 1 и FALSE как 0.

В операторе if, если выражение имеет ненулевое значение, выполняется первый оператор, а иначе выполняется второй (если он указан). Таким образом, в качестве условия допускается любое выражение типа целое или указатель. Пусть a целое, тогда

if (a)  // ...

эквивалентно

if (a != 0) ...

Логические операции

&&    ||   !

обычно используются в условиях. В операциях && и || второй операнд не вычисляется, если результат определяется значением первого операнда. Например, в выражении

if (p && l<p->count)  // ...

сначала проверяется значение p, и только если оно не равно нулю, то проверяется отношение l<p->count.

Некоторые простые операторы if удобно заменять выражениями условия. Например, вместо оператора

if (a <= b)
   max = b;
else
   max = a;

лучше использовать выражение

max = (a<=b) ? b : a;

Условие в выражении условия не обязательно окружать скобками, но если их использовать, то выражение становится понятнее.

Простой переключатель (switch) можно записать с помощью серии операторов if. Например,

switch (val) {
 case 1:
     f();
     break;
 case 2:
     g();
     break;
 default:
     h();
     break;
 }

можно эквивалентно задать так:

if (val == 1)
    f();
 else if (val == 2)
    g();
 else
    h();

Смысл обеих конструкций совпадает, но все же первая предпочтительнее, поскольку в ней нагляднее показана суть операции: проверка на совпадение значения val со значением из множества констант. Поэтому в нетривиальных случаях запись, использующая переключатель, понятнее.

Нужно позаботиться о каком-то завершении оператора, указанного в варианте переключателя, если только вы не хотите, чтобы стали выполняться операторы из следующего варианта. Например, переключатель

switch (val) { // возможна ошибка
case 1:
    cout << "case 1\n";
case 2:
    cout << "case 2\n";
default:
    cout << "default: case not found\n";
}

при val==1 напечатает к большому удивлению непосвященных:

case 1
case 2
default: case not found

Имеет смысл отметить в комментариях те редкие случаи, когда стандартный переход на следующий вариант оставлен намеренно. Тогда этот переход во всех остальных случаях можно смело считать ошибкой. Для завершения оператора в варианте чаще всего используется break, но иногда используются return и даже goto. Приведем пример:

switch (val)  { // возможна ошибка
case 0:
    cout << "case 0\n";
case1:
case 1:
    cout << "case 1\n";
    return;
case 2:
    cout << "case 2\n";
    goto case1;
default:
    cout << "default: case not found\n";
    return;
}

Здесь при значении val равном 2 мы получим:

case 2
case 1

Отметим, что метку варианта нельзя использовать в операторе goto:

goto case 2;  // синтаксическая ошибка

3.3.2 Оператор goto

Презираемый оператор goto все-таки есть в С++:

goto идентификатор;

идентификатор: оператор

Вообще говоря, он мало используется в языках высокого уровня, но может быть очень полезен, если текст на С++ создается не человеком, а автоматически, т.е. с помощью программы. Например, операторы goto используются при создании анализатора по заданной грамматике языка с помощью программных средств. Кроме того, операторы goto могут пригодиться в тех случаях, когда на первый план выходит скорость работы программы. Один из них - когда в реальном времени происходят какие-то вычисления во внутреннем цикле программы.

Есть немногие ситуации и в обычных программах, когда применение goto оправдано. Одна из них - выход из вложенного цикла или переключателя. Дело в том, что оператор break во вложенных циклах или переключателях позволяет перейти только на один уровень выше. Приведем пример:

void f()
{
  int i;
  int j;

  for ( i = 0; i < n; i++)
for (j = 0; j<m; j++)
  if (nm[i][j] == a) goto found;
// здесь a не найдено
// ...
  found:
//  nm[i][j] == a
}

Есть еще оператор continue, который позволяет перейти на конец цикла.

Равиль Ярупов
Равиль Ярупов
Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

как я получу диплом о профессиональной переподготовке?

Даниил Вирченко
Даниил Вирченко
Россия, Краснодар