//
string lettergrade;
if (grade < 60)
lettergrade = scores[0];
else
lettergrade = scores[(grade - 50)/10];
В зависимости от значения переменной grade
оператор выполняется либо после части if
, либо после части else
. В части else
вычисляется индекс оценки уже без неудовлетворительных. Затем усекающее остаток целочисленное деление (см. раздел 4.2) используется для вычисления соответствующего индекса вектора scores
.
if
Чтобы сделать программу интересней, добавим к удовлетворительным отметкам плюс или минус. Плюс присваивается оценкам, заканчивающимся на 8 или 9, а минус — заканчивающимся на 0, 1 или 2.
if (grade % 10 > 7)
lettergrade += '+'; //
else if (grade % 10 < 3)
lettergrade += '-'; //
Для получения остатка и принятия на основании его решения, добавлять ли плюс или минус, используем оператор деления по модулю (см. раздел 4.2).
Теперь добавим код, присваивающий плюс или минус, к коду, выбирающему символ оценки:
//
if (grade < 60)
lettergrade = scores[0];
else {
lettergrade = scores[(grade - 50)/10]; //
if (grade != 100) //
if (grade % 10 > 7)
lettergrade += '+'; //
//
else if (grade % 10 < 3)
lettergrade += '-'; //
//
}
Обратите внимание, что два оператора, следующих за первым оператором else
, заключены в блок. Если переменная grade
содержит значение 60
или больше, возможны два действия: выбор символа оценки из вектора scores
и, при условии, добавление плюса или минуса.
Когда несколько операторов следует выполнить как блок, довольно часто забывают фигурные скобки. В следующем примере, вопреки отступу, код добавления плюса или минуса выполняется безусловно:
if (grade < 60)
lettergrade = scores[0];
else //
lettergrade = scores[(grade - 50)/10];
//
//
//
if (grade != 100)
if (grade % 10 > 7)
lettergrade += '+'; //
//
else if (grade % 10 < 3)
lettergrade += '-'; //
//
Найти такую ошибку бывает очень трудно, поскольку программа выглядит правильно.
Во избежание подобных проблем некоторые стили программирования рекомендуют всегда использовать фигурные скобки после оператора if
или else
(а также вокруг тел циклов while
и for
).
Это позволяет избежать подобных ошибок. Это также означает, что фигурные скобки уже есть, если последующие изменения кода потребуют добавления операторов.
else
Когда один оператор if
вкладывается в другой, ветвей if
может оказаться больше, чем ветвей else
. Действительно, в нашей программе оценивания четыре оператора if
и два оператора else
. Возникает вопрос: как установить, которому оператору if
принадлежит данный оператор else
?
Эта проблема, обычно называемая else
(dangling else
), присуща многим языкам программирования, предоставляющим операторы if
и if else
. Разные языки решают эту проблему по-разному. В языке С++ неоднозначность решается так: оператор else
принадлежит ближайшему расположенному выше оператору if
без else
.