.: [предыдущая | оглавление | следующая] :.

2.10. Операторы

2.10.1. Составной оператор

Группирование операторов производится с помощью фигурных скобок, и эта конструкция может быть рассмотрена как один оператор. С другой стороны, в некоторых языках программирование вводится понятие блока. Блок - это выделенная группа операторов, в которой можно объявлять локальные переменные. Например:

{ x=20; y=30; }

2.10.2. Условный оператор

Условный оператор в Си предназначен для организации ветвления. Существует две синтаксические конструкции условного оператора:

  1. if (<выражение>) <оператор>            
  2. if (<выражение>) <оператор 1> else <оператор 2>

При выполнении условного оператора номер 1, первым вычисляется выражение, стоящее в скобках после ключевого слова if. Если полученное значение выражения не равно нулю, то выполняется оператор (операторы), заключенный в фигурные скобки, стоящие непосредственно за закрывающейся круглой скобкой.

Если выражение равно нулю, то оператор, следующий за закрывающей круглой скобкой, не выполняется. Далее выполняется следующий за условием оператор.

Во втором случае, если выражение не равно нулю, то выполняется <оператор1>; а оператор, следующий за ключевым словом «else», не выполняется. Если выражение равно нулю, то <оператор 1> не выполняется, а оператор, следующий за «else», выполняется.
Рассмотрим пример:

//пример 1
if (x == 10) z=100; //оператор z=100; будет выполняться если x равно 10.
//пример 2
if (k) z=1; //оператор z=1; если k будет не равно нулю.
//пример 3
if (k & b) { m=10; k=20; } //операторы будут выполнены если результат k&b будет не равен нулю.
//пример 4
if ((c=getch()) == ’a’)
{
      puts ("введена буква а;");
      c = 'A';
}

В этом примере первоначально производится ввод символа с клавиатуры (функция getch()), присвоение кода введенного символа переменной c и сравнение введенного кода символа с кодом символа ’a’. Таким образом, если была нажата клавиша ’a’, то будет выведено сообщение "введена буква а;" и переменной c будет присвоен код символа ’A’.

//пример 5
if (x == b) z=d; else z=b;

Если значение x равно значению b, то переменной z будет присвоено значение d. В противном случае, переменной z будет присвоено значению b.

//пример 6
if (x == a || x==b ) { m=a*b; j++;}
else { swap(a,b); j--; }

В этом примере показано, что операторы можно группировать, используя фигурные скобки. Если значение переменной x равно значению переменных a или b, то выполняются операторы в первом блоке. В противном случае, операторы в во втором блоке.

//пример 7
if (k)
     if (m) x=1;
     else x=2;
// то же самое:
if (k)
{
     if (m) x=1;
     else x=2;
}

В этом примере показано управление во вложенных операторах if.

//пример 8
/*1*/ x=10; m=2; t=3; k=3;
/*2*/ if (k == 2)
/*3*/     if (m == 2) x=1;
/*4*/     else
/*5*/         if (t == 3) x=4;
/*6*/         else ;
/*7*/ else x=5;
/*8*/ printf ("%d\n",x);

В этом примере будет напечатано число 5. Предложение else; (строка 6) необходимо для того, чтобы else в строке 7 относился к if строки 2.

//пример 9
k=0;
if (k=10) c=50;
else c=40;

В этом примере записана часто встречающаяся ошибка у начинающих, когда вместо операции сравнения «==», стоит операция присваивания «=». В этом случае условие проверяется в зависимости от результата присвоения, если результат присвоения не равен нулю, то выполняется оператор с=50, иначе с=40.

Можно дать общие рекомендации при написании вложенных условных операторов: если есть сомнения, ставьте фигурные скобки!

if (...) {
if (...) ; else...
}
else ... }

2.10.3. Оператор while

Оператор while предназначен для организации цикла в программе. Под циклом в программировании понимают последовательность операторов, которая может выполняться некоторое количество раз. Блок-схема оператора while показана на рисунке: while (<выражение>) <оператор>

Оператор while выполняется следующим образом: при входе в цикл вычисляется выражение, записанное в скобках; если оно не равно нулю, то выполняется оператор (или последовательность операторов, заключенные в фигурных скобках).

Далее снова вычисляется выражение, стоящее в скобках. Оператор будет выполняться до тех пор, пока выражение не станет равным нулю.
Рассмотрим пример:

while (x>0) {s=s+x; x--;}

В этом примере производится накопление суммы до тех пор, пока x не станет меньше или равно нулю.

while (*s++=*p++);

В этом примере производится копирование последовательности байт (или слов) до тех пор, пока не встретится ноль. Это удобно при копировании строк символов.

while (1);

Бесконечный цикл

i=0; while (i<n) {s=s+v[i]; i++;}

В этом примере организуется цикл для вычисления суммы элементов массива.

while (mousestatus(&k,&y)==1);

В этом примере в цикле будет вызываться функция mousestatus, пока она будет возвращать значение, равное 1.

while (*ch == ’ ’) ch++;

В этом примере производится проверка строки символов, указатель наращивается, пока не встретится пробел.

2.10.4. Оператор for

Оператор for предназначен для организации цикла. Правила записи этого оператора следующие:

for (<выражение 1>;<выражение 2>;<выражение 3>) <оператор А>.

Выполнение оператора for начинается с вычисления <выражение 1>, затем вычисляется <выражение 2>. Если его значение равно нулю, то цикл завершается.
       При этом <оператор А> не выполняется. Если <выражение 2> не равно нулю, то выполняется <оператор А>, затем выполняется <выражение 3>, после этого снова вычисляет <выражение 2>. Если значение равно нулю, то цикл завершается; если нет, то цикл продолжается.

Примеры:

for (;;);

В этом примере записан бесконечный цикл.

for (i=0; i<n; i++) s=s+v[i];

В этом примере записан цикл для вычисления суммы некоторого массива. Первоначально, i присваивается 0, далее производится проверка (i<n). Если она истинна, то цикл прекращается и управление переходит на первый оператор, записанный после цикла. Если условие ложно, то выполняется оператор s=s+v[i]; и далее i увеличивается на единицу.

for (i=n-1; i>=0; i--) s=s+v[i];

В этом примере находится та же сумма, только просмотр начинается с последнего элемента массива. Поскольку в Си элемент массива начинается с нуля, то последний имеет номер n-1.

for (i=0; s=0; i>0; s=s+v[i],i++);

Это одна из возможных записей для вычисления суммы массива.

2.10.5. Оператор do while

Оператор do while предназначен для организации цикла в программе. Правила записи оператора следующие:

do <оператор> while (<выражение>);

При входе в цикл выполняется <оператор>. Далее производится вычисление выражения. Если значение выражения не равно нулю, то <оператор> выполняется снова; если выражение равно нулю, то цикл завершается. Выполнение цикла производится до тех пор, пока значение выражения не станет равным нулю.

В отличие от оператора while, в круглых скобках сначала производится проверка, а потом выполнение оператора, в операторе do while сначала выполняется оператор, а потом производится проверка условия.

2.10.6 Оператор continue

Оператор continue предназначен для завершения очередной итерации в операторе цикла. Например:

for(i=0; i<n; i++)
{
      if(a[i] < 0) continue; //Завершить очередную итерацию
      s=s+a[i]; //этот оператор не будет выполнен, если элемент отрицателен
}

Этот фрагмент программы вычисляет суммы неотрицательных элементов массива.

2.10.7. Оператор break

Оператор break предназначен для выхода:

  1. за пределы цикла;
  2. для выхода из оператора switch.

При выполнении этого цикл прекращается и выполняется следующий оператор, записанный после цикла. Например:

for(i=0; i<n; i++)
{
      if(a[i] < 0) break; //завершить цикл, если элемент отрицателен
      s=s+a[i]; //этот оператор не будет выполнен, если элемент отрицателен
}

Этот фрагмент программы вычисляет суммы неотрицательных элементов массива, до тех пор, пока не встретится отрицательный элемент.

2.10.8. Оператор switch

Оператор switch предназначен для организации множественного ветвления. Имеется входной блок, в котором проверяется условие ветвления и далее переходит на один из блоков, записанных под номерами 1..n.

Формальная структура данного оператора следующая:

switch(<условие>)
{
      case <константа 1>: <операторы>
      break;

      case <константа 2>: <операторы>
      break;
      ...
      default: <операторы>
}

Оператор break может отсутствовать, тогда будут выполняться операторы следующего блока case . Блок default необходим для случая, когда нет перехода ни на один case-блок. Он также может отсутствовать.
Рассмотрим примеры:

Пример 1.
switch(strcmp(str1,str2))
{
      case 0: puts(“строки равны”);
      break;

      case 1: puts(“str1>str2”);
      break;
      case -1: puts(“str1<str2”);
      break;
}

Пример 2.
#define RETURN 13 //записать константы для спец клавиш
#define ESC 27
#define BAKCSPACE 9
int ch;
ch=getch(); //взять код клавиши
switch(ch)
{
      case RETURN: puts(“Перевод строки”);
      break;

      case ESC: puts(“Нажата ESC”);
      break;

      case BACKSPACE: puts(“Нажата клавиша BS”);
      break;

      default: puts(“нажата буква или цифра или знак”);
      break;
}

В этом примере показано, как можно организовать множественное ветвление с блоком default. В данном случае, коды специальных клавиш записаны как константы, код нажатой клавиши запоминается в переменной ch. Блок default нужен для выявления ситуации, когда нажата не специальная клавиша.

2.10.9. Оператор return

Оператор return предназначен для возврата управления и значения из функции. Правила записи следующие:

  1. return;
  2. return <выражение>.

В первом случае никакого значения не передается. Во втором случае передается значение выражения. Например:

return 1;
return 3*b;

2.10.10. Метки и оператор goto

Любой оператор в функции может быть помечен меткой. Метка - это некоторый идентификатор, стоящий перед оператором и разделенный точкой с запятой. Правила записи следующие: <метка>: <оператор>. Например:

  1. return;
  2. return <выражение>.

В первом случае никакого значения не передается. Во втором случае передается значение выражения. Например:

L1: x=10;
Metka: if (x>20) y=10; else y=20;

Метки определены только внутри одной функции.

Метки используют оператор goto, который обеспечивает безусловный переход на указанную метку. Правила записи следующие:

goto <метка>;
Например:
for (i=0;i<n;i++)
     for for(j=0;j<m;j++)
     {
         if (x[i][j]<0) goto Exit;
     }
Exit: ShowX();
     ...

В этом примере показана организация выхода сразу из нескольких циклов. Использование оператора break ограничено только одним циклом.

.: [предыдущая | оглавление | следующая] :.