Условные конструкции


Условные конструкции позволяют направить ход программы по одному из возможных путей в зависимости от условия. В языке Си есть несколько операторов, которые позволяют это сделать.

Оператор if
Оператор if проверяет истинность условия, и если оно истинно, выполняет блок инструкций. Этот оператор имеет следующую сокращенную форму:

1
if (выражение_условия) инструкция;
В качестве выражения_условия может использоваться арифметическая, логическая операция или операция сравнения. И если эта операция возвращает ненулевое значение (то есть выражение истинно), то выполняется последующая инструкция:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main(void)
{
int x = 60;

if(x > 50) printf("x is greater than 50 \n");

if(x < 30) printf("x is less than 30 \n");

return 0;
}
Здесь используются две условных конструкции if. Они проверят больше или меньше значение переменной x, чем определенное значение. В качестве инструкции в обоих случаях выполняется функция printf.

В первом случае x > 50 условие истинно, так как значение переменной x действительно больше 50, поэтому эта операция сравнения возвратит 1, и поэтому будет выполнятся последующая инструкция.

Во вором случае операция сравнения x < 30 возвратит 0, так как условие ложно, поэтому последующая инструкция не будет выполняться. Поэтому на консоль будет выведена всего одна строка

x greater than 50
Если в конструкции if необходимо выполнить не одну, а несколько инструкций, то эти инструкции оформляются в блок кода с помощью фигурных скобок:

1
2
3
4
5
6
7
int x = 60;

if(x > 50)
{
printf("if statement \n");
printf("x is greater than 50 \n");
}
Также мы можем использовать полную форму оператора if:

1
2
3
4
if(выражение_условия)
инструкция_1
else
инструкция_2
После оператора else мы можем определить набор инструкций, которые выполняются, если выражение_условия ложно, то есть возвращает 0. То есть если выражение_условия истинно, выполнится инструкция после оператора if, а если это выражение ложно, то выполняется инструкция после оператора else.

1
2
3
4
5
int x = 60;
if(x > 60)
printf("x is greater than 60 \n");
else
printf("x is less or equal 60 \n");
Однако в данном случае у нас есть три условия: переменная x может быть больше 60, меньше 60 и равна 60. Для проверки альтернативных условий мы можем вводить выражения else if:

1
2
3
4
5
6
7
8
int x = 60;

if(x > 60)
printf("x is greater than 60 \n");
else if (x < 60)
printf("x is less than 60 \n");
else
printf("x is equal 60 \n");
То есть в данном случае мы получаем три ветки развития событий в программе.

И также если после операторов должен идти набор инструкций, то эти инструкции оформляются в блок кода:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int x = 60;

if(x > 60)
{
printf("if statement \n");
printf("x is greater than 60 \n");
}
else if (x < 60)
{
printf("else if statement \n");
printf("x is less than 60 \n");
}
else
{
printf("else statement \n");
printf("x is equal 60 \n");
}
Конструкция switch
Другую форму организации ветвления программ представляет конструкция switch...case. Она имеет следующую форму:

1
2
3
4
5
6
7
switch(выражение)
{
case константа_1: инструкции_1;
case константа_2: инструкции_2;

default: инструкции;
}
После ключевого слова switch в скобках идет сравниваемое выражение. Значение этого выражения последовательно сравнивается со значениями, помещенными после оператора сase. И если совпадение будет найдено, то будет выполняться определенный блок сase.

В конце конструкции switch может стоять блок default. Он необязателен и выполняется в том случае, если ни одна совпадения в блоках case не было найдено. Например:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
int main(void)
{
int x = 2;

switch(x)
{
case 1:
printf("x = 1 \n");
break;
case 2:
printf("x = 2 \n");
break;
case 3:
printf("x = 3 \n");
break;
default:
printf("x is undefined \n");
break;
}
return 0;
}
Чтобы избежать выполнения последующих блоков case/default, в конце каждого блока ставится оператор break.

Тернарный оператор
Тернарный оператор ?: позволяет сократить определение простейших условных конструкций if и имеет следующую форму:

1
[первый операнд - условие] ? [второй операнд] : [третий операнд]
Оператор использует сразу три операнда. В зависимости от условия тернарный оператор возвращает второй или третий операнд: если условие равно 1 (то есть истинно), то возвращается второй операнд; если условие равно 0 (то есть ложно), то третий. Например:

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int main(void)
{
int x=3;
int y=2;
char op ='+';

int z = op == '+'? (x+y) : (x-y);

printf("z = %d", z); // 5
return 0;
}
Здесь результатом тернарной операции является переменная z. И если переменная op содержит знак "+", то z будет равно второму операнду - (x+y). Иначе z будет равно третьему операнду.