int main (int argc, char argv[]) { NSAutoreleasePool pool = [[NSAutoreleasePool alloc] init]; int year, rem_4, remJOO, remJOO; NSLog (@"Enter the year to be tested:"); scant («%i», &year); rem J = year % 4; remJOO = year % 100; remJOO = year % 400; if ( (rem 4 == 0 && remJOO != 0) || remJOO == 0 ) NSLog ((ants a leap year."); else NSLog (@"Nope, its not a leap year."); [pool drain]; return 0; } Вывод программы 6.5 Enter the year to be tested: (Введите год для проверки) 1955 Nope, its not a leap year. (Нет, это не високосный год) Вывод программы 6.5 (повторный запуск) Enter the year to be tested: 2000 Its a leap year. (Это високосный год) Вывод программы 6.5 (повторный запуск) Enter the year to be tested: 1800 Nope, its not a leap year. (Нет, это не високосный год) В приведенных примерах вводится 1955-й год, который не является високосным, поскольку он не делится нацело на 4, 2000-й год, который является високосным, поскольку он делится нацело на 400, и 1800-й год, который не является високосным, поскольку он делится нацело на 100, но не на 400. В качестве последнего варианта следует проверить год, который делится нацело на 4, но не на 100. Выполните эту проверку самостоятельно. Objective-C дает программисту очень высокий уровень гибкости при формировании выражений. Например, в приведенной выше программе вместо вычисления промежуточных результатов rem_4, remJOO и rem_400 можно было бы сделать все непосредственно в операторе if: if (( year % 4 == 0 && year % 100 != О ) || year % 400 == 0 ) Использование пробелов для разделения отдельных операторов делает это выражение более удобным для чтения. Если игнорировать эти возможности и удалить необязательный набор круглых скобок, то получится следующее выражение: if(year%4==0&&year%100!=0)||year%400==0) Это выражение действует точно так же, как предыдущее выражение, однако дополнительные пробелы очень упрощают восприятие составных выражений. Вложенные операторы if
При рассмотрении общего формата оператора if мы указывали, что если результатом оценки выражения в круглых скобках является значение TRUE, то выполняется следующий оператор. Этим программным оператором может быть еще один оператор if, как в следующих строках. if ( [chessGame isOver] == NO ) ([игра в шахматы окончена] == НЕТ) if ( [chessGame whoseTurn] == YOU )([... чей ход] == ВАШ) [chessGame yourMove]; ([... ваш ход]) Если значение, возвращаемое после отправки сообщения isOver объекту chessGame, равно N0, то выполняется следующий оператор; в свою очередь, этот оператор является еще одним оператором if. Этот оператор if сравнивает значение, возвращаемое методом whoseTurn, со значением YOU. Если эти два значения равны, то объекту chessGame отправляется сообщение yourMove. Таким образом,
сообщение yourMove отправляется только в том случае, если игра не окончена, и это ваш ход. Эти операторы можно было бы записать с помощью составной операции сравнения: if ( [chessGame isOver] == N0 && [chessGame whoseTurn] == YOU ) [chessGame yourMove]; Обычно с вложенными операторами if используют предложение else, как показано ниже. if ( [chessGame isOver] == N0 ) ([игра в шахматы окончена] == НЕТ) if ( [chessGame whoseTurn] == YOU )([... чей ход] == ВАШ) [chessGame yourMove]; ([... ваш ход]) else [chessGame my Move]; ([... мой ход]) Сначала все выполняется, как и раньше, но если игра не окончена и ход не ваш, то выполняется предложение else. В результате сообщение myMove отправляется объекту chessGame. Если игра окончена, то пропускается весь следующий оператор if вместе с присоединенным к нему предложением else. Предложение else связано с оператором if, который проверяет значение, возвращаемое методом whoseTurn, а не с оператором if, который проверяет, окончена ли игра (chessGame isOver). Общее правило состоит в том, что предложение else всегда связывается с последним оператором if, не содержащим else. Можно продвинуться еще на один шаг и добавить предложение else к внешнему оператору if. Это предложение else выполняется, если игра окончена. if ( [chessGame isOver] == NO ) ([игра в шахматы окончена] == НЕТ) if ( [chessGame whoseTurn] == YOU )([... чей ход] == ВАШ) [chessGame yourMove]; ([... ваш ход]) else [chessGame myMove]; ([...мой ход]) else [chessGame finish]; (... конец) Конечно, система может интерпретировать этот оператор и по-другому. Например, если в предыдущем примере удалить первое предложение else, то оператор не будет интерпретироваться в соответствии с показанными отступами. if ( [chessGame isOver] == NO ) if ( [chessGame whoseTurn] == YOU ) [chessGame yourMove]; else [chessGame finish]; Вместо этого оператор будет интерпретироваться следующим образом: if ( [chessGame isOver] == NO ) if ( [chessGame whoseTurn] == YOU ) [chessGame yourMove]; else [chessGame finish]; Предложение else связывается с последним оператором if, не включающим else. Можно использовать фигурные скобки, чтобы связать else с внешним if, а не с внутренним. Фигурные скобки замыкают оператор if, который находится внутри них. Нужная последовательность задается с помощью следующего оператора. if ( [chessGame isOver] == NO ) { if ( [chessGame whoseTurn] == YOU ) [chessGame yourMove]; } else [chessGame finish]; Конструкция else if