Опубликован: 10.10.2006 | Доступ: свободный | Студентов: 5981 / 453 | Оценка: 4.26 / 3.88 | Длительность: 31:30:00
Лекция 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, который позволяет перейти на конец цикла.

Дарья Федотова
Дарья Федотова
Сергей Березовский
Сергей Березовский

В рамках проф. переподготовки по программе "Программирование"

Есть курсы, которые я уже прошел. Но войдя в курс я вижу, что они не зачтены (Язык Ассемблера и архитектура ЭВМ, Программирование на С++ для профессионалов). Это как?

Сергей Мороз
Сергей Мороз
Беларусь
Валентина Зубарева
Валентина Зубарева
Россия, Рязань, РГРТУ, 2011