Нет никаких ограничений на использование любых операторов в блоках выражений в конструкции if-else, в том числе на использование дополнительных операторов if и else. В этом случае будет получена вложенная конструкция из нескольких операторов if:
if (условие1)
{
if (условие2)
выражение1;
else
{
if (условиеЗ) выражение2;
else
выражениеЗ;
}
}
else
выражение4;
Смысл этой конструкции из нескольких операторов if можно расшифровать так: если условие1 истинно и условие2 истинно, выполните выражение1. Если условие1 истинно, а условие2 — нет, тогда проверьте условиеЗ и, если оно истинно, выполните выражение2. Если условие1 истинно, а условие2 и условиеЗ — нет, тогда выполните выражениеЗ. Наконец, если условие1 ложно, выполните выражение4. Да, вложенные операторы if могут кого угодно запутать!
Пример использования такой сложной конструкции с несколькими операторами if показан в листинге 4.7.
Листинг 4.7. Сложные конструкции с вложенными операторами if
1: // Листинг 4.7. Пример сложной конструкции с
2: // вложенными операторами if
3: #include
4: int main()
5: {
6: // Запрашиваем два числа
7: // Присваиваем числа переменным bigNumber и littleNumber
8: // Если значение bigNumber больше значения littleNumber,
9: // проверяем, делится ли большее число на меньшее без остатка
10: // Если да, проверяем, не равны ли они друг другу
11:
12: int firstNumber, secondNumber;
13: cout << "Enter two numbers.\nFirst: ";
14: cin >> firstNumber;
15: cout << "\nSecond: ";
16: cin >> secondNumber;
17: cout << "\n\n";
18:
19: if (firstNumber >= secondNumber)
20: {
21: if ( (firstNumber % secondNumber) == 0) // evenly divisible?
22: {
23: if (firstNumber == secondNumber)
24: cout << "They are the same!\n";
25: else
26: cout << "They are evenly divisible!\n";
27: }
28: else
29: cout << "They are not evenly divisible!\n";
30: }
31: else
32: cout << "Hey! The second one is larger!\n";
33: return 0;
34: }
Результат:
Eriter two numbers.
First: 10
Second: 2
They are evenly divisible!
Анализ:Сначала пользователю предлагается ввести два числа (по очереди), затем эти числа сравниваются. С помощью первого оператора if (в строке 19) мы хотим убедиться в том, что первое число больше или равно второму. Если мы убеждаемся в обратном, то выполняется выражение после оператора else, представленного в строке 31.
Если первое сравнение возвращает true, то выполняется блок инструкций, начинающийся в строке 20, где с помощью второго оператора if в строке 21 проверяется предположение, что первое число делится на второе без остатка (т.е. с остатком, равным нулю). Если это предположение подтверждается, то первое число либо кратно второму, либо они вообще равны друг другу. Оператор if в строке 23 проверяет версию о равенстве чисел, а затем на экран выводится сообщение, уведомляющее о выявленном соотношении.
Если оператор if в строке 21 возвращает значение false, то выполняется оператор else в строке 28.
Использование фигурных скобок для вложенных операторов if
Фигурные скобки можно не использовать в конструкциях с оператором if, если эта конструкция состоит только из одного выполняемого выражения. Это справедливо и в случае вложения нескольких операторов if, как показано ниже:
if (x>у) // если x больше у
if (x
x = у; // тогда присваиваем x значение у
Однако при создании сложных вложенных конструкций без использования фигурных скобок бывает трудно разобраться, какое выражение какому оператору if принадлежит.
Не забывайте, что пробелы и отступы делают программу понятнее для программиста, но никак не влияют на работу компилятора. Даже если вы покажете с помощью отступа, что данный оператор else относится к конструкции этого оператора if, компилятор может с вами не согласиться. Данная проблема иллюстрируется в листинге 4.8.
Листинг 4.8. Пример использования фигурных скобок для правильного сопоставления операторов else и if
1: // Листинг 4.8. Пример использования фигурных скобок
2: // в конструкциях с вложенными операторами if
3: #include
4: int main()
5: {
6: int x;
7: cout << "Enter а number less than 10 or greater than 100: ";
8: cin >> x;
9: cout << "\n";
10:
11: if (x >= 10)
12: if (x > 100)
13: cout << "More than 100, Thanks!\n";
14: else // к какому оператору if относится этот оператор
15: cout << "Less than 10, Thanks!\n";
16:
17: return 0;
18: }
Результат:
Enter a number less than 10 or greater than 100
Less than 10, Thanks!
Анализ:Программа запрашивает ввод числа меньше 10 или больше 100 и должна проверить введенное значение на соответствие выдвинутому требованию, а затем вывести сообщение.
Читать дальше