itmo.ru aco.ifmo.ru c-visionlab.ru
вернуться в оглавление предыдущая глава предыдущий параграф следующий параграф следующая глава


1.4. Логические выражения и оператор if

1.4.1 Условные конструкции. Пример условных конструкций (пример 4)

Условные конструкции позволяют в зависимости от условия выполнять блок операторов, заключенный в фигурные скобки.

if( условие ) 
{
    блок операторов;
} 

Если условие удовлетворено, то "блок операторов" в теле if выполняется.

Если условие не удовлетворяется, то "блок операторов"в теле if не выполняется.

if( условие ) 
{
    блок операторов 1;
}
        else
{
    блок операторов 2;
} 

Если условие выполняется, то выполняется "блок операторов 1".

Если условие не удовлетворено, то выполняется "блок операторов 2".

Условия в операторах if могут быть образованы с помощью операций равенства и отношений. В примере несколько операторов if сравнивают два вводимых пользователем числа. Если в каком-либо из этих операторов условие удовлетворяется (равно true) – выполняется связанный с данным if оператор вывода.

Если внутри условия только один оператор, допустимо не использовать фигурные скобки. Если операторов 2 и более – использование фигурных скобок обязательно.

/////////////////////////////////////////////////////////////////////////////
// Программирование на языке высокого уровня. Основы языка С++
// Пример 4. Пример условных конструкций
// 
// http://aco.ifmo.ru/el_books/programming
// Университет ИТМО
/////////////////////////////////////////////////////////////////////////////
// подключение библиотеки ввода-вывода
#include <iostream>
// подключение стандартного пространства имен для использования библиотек
using namespace std;
 
/////////////////////////////////////////////////////////////////////////////
// функция main начинает исполнение программы 
void main()
{
    // объявление переменных 
    int x,y;

    cout<<"Enter two integers to compare: "; // запросить ввод 
    cin>>x>>y; // прочитать два введенных числа 

    if(x == y)  // число x равно числу y ? 
        cout<<x<<" == "<<y<<endl; 
    if(x != y)  // число x не равно числу y?
        cout<<x<<" != "<<y<<endl; 
    if(x < y)   // число x меньше числа y ? 
        cout<<x<<" < "<<y<<endl; 
    if(x > y)   // число x больше числа y ? 
        cout<<x<<" > "<<y<<endl; 
    if(x <= y)  // число x меньше либо равно числу y ? 
        cout<<x<<" <= "<<y<<endl; 
    if(x >= y)  // число x больше либо равно числу y ? 
        cout<<x<<" >= "<<y<<endl; 
}
/////////////////////////////////////////////////////////////////////////////

1.4.2 Логические выражения. Логические операции И, ИЛИ, НЕ (пример 5)

Выражение, находящееся внутри круглых скобок оператора if – логическое выражение. Логическое выражение может принимать два значения – true (истинно) или false (ложно). Рассмотрим еще один пример, который определяет, попала ли точка с координатами x, y в прямоугольник:

/////////////////////////////////////////////////////////////////////////////
// Программирование на языке высокого уровня. Основы языка С++
// Пример 5. Пример определения попадания точки в прямоугольник 
// 
// http://aco.ifmo.ru/el_books/programming
// Университет ИТМО
/////////////////////////////////////////////////////////////////////////////
// подключение библиотеки ввода-вывода
#include <iostream>
// подключение стандартного пространства имен для использования библиотек
using namespace std;
 
/////////////////////////////////////////////////////////////////////////////
// функция main начинает исполнение программы 
void main()
{
    // объявление переменных 
    double x,y;

    cout<<"Enter point coordinate (x,y): "; // запросить ввод 
    cin>>x>>y; // прочитать два введенных числа 

    // первый вариант решения
    // если точка находится внутри прямоугольника
    if(x<2 && x>-2 && y>-1 && y<1)  
        cout<<"Point inside"<<endl; 
    else
        cout<<"Point outside"<<endl; 
 
    // второй вариант решения
    // если точка находится внутри прямоугольника
    bool x_inside=x<2 && x>-2;
    bool y_inside=y<1 && y>-1;
    if(x_inside && y_inside)  
        cout<<"Point inside"<<endl; 
    else
        cout<<"Point outside"<<endl; 
}
/////////////////////////////////////////////////////////////////////////////

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

  • && - логическое И
  • || - логическое ИЛИ
  • ! - логическое НЕ

В данном примере, для определения попадания точки внутрь прямоугольника нам надо проверить условие, которое математически можно записать как -1 < x < 1. При записи этого выражения на С++ нам придется воспользоваться операцией && (логического И) для объединения двух условий: x<2&&x>-2. Это условие равно true в том и только том случае, когда оба простых условия равны true. Логические операции И, ИЛИ и НЕ имеют более высокий приоритет чем операции сравнения, поэтому скобки не являются необходимыми. Однако, для удобства чтения можно добавить круглые скобки:

 (x<2)&&(x>-2).

Если бы нам надо было определить, что точка НЕ попадает внутрь прямоугольника, нам потребовалась бы использовать оператор ИЛИ (координата x либо меньше -2, либо больше 2):

 (x >2)||(x<-2)

Либо можно было бы воспользоваться оператором НЕ (координата x НЕ лежит внутри прямоугольника):

 !( (x <2)&&(x >-2) )

Таблица показывает все четыре возможных комбинации значений false и true для операций И и ИЛИ с двумя выражениями.

выражение 1

выражение 2

(выражение 1) && (выражение 2)

(выражение 1) || (выражение 2)

true

true

true

true

true

false

false

true

false

true

false

true

false

false

false

false

При написании выражений, содержащих много операций, справляйтесь с таблицей старшинства и ассоциативности (приложение ?). Если вы не уверены относительно порядка оценки в сложном выражении, используйте для задания нужного порядка круглые скобки, как в алгебраических выражениях.

1.4.3 Типичные ошибки

if(x==1) // правильно!
{
    y=x+3;
    z=y*5;
} 

if(x=1) // неправильно! 
// выполняется всегда!
{
    y=x+3;
    z=y*5;
} 

ошибочное употребление операции присваивания = вместо операции равенства ==

if(x==1); // неправильно! 
// выполняется всегда!
{
    y=x+3;
    z=y*5;
}

эквивалентно коду:

if(x==1)
{
   [пустой оператор]; 
}
y=x+3;
z=y*5;
if(x==1) // неправильно!
    y=x+3;
    z=y*5;



отсутствуют фигурные скобки, хотя в условии задумано больше одного оператора

эквивалентно коду:

if(x==1)
{
    y=x+3;
}
z=y*5;

 

1.4.4 Вложенные условия

Для вложенных условий, когда одно условие находится внутри другого очень важно соблюдать правильную последовательность операторов и правильно расставлять фигурные скобки.

Например:

if( х > 5 ) 
    if( У > 5 ) 
        cout<<"x and у are > 5"; 
else 
    cout<<"x is <= 5"; 

Судя по отступам, в данном примере ожидается, что оператор else относится к условию x>5. На самом же деле оператор else всегда относится к ближайшему к нему оператору if. Данный пример будет выполняться так:

if( х > 5 )
    if( У > 5 ) 
        cout<<"x and у are > 5"; 
    else 
        cout<<"x is <= 5"; 

Чтобы вложенный оператор if... else выполнялся так, как предполагалось сначала, мы должны написать его следующим образом:

if( х > 5 ) 
{ 
    if( У > 5 ) 
        cout<<"x and у are > 5"; 
} 
else 
    cout<<"x is <= 5";