|
Программирование >> Инициализация объектов класса, структура
if ( int ival = compute value() ) { область видимости ival ограничена этим блоком ошибка: ival невидим компиляции: if ( ! ival ) .. Попробуем для иллюстрации применения инструкции if реализовать функцию min() , возвращающую наименьший элемент вектора. Заодно наша функция будет подсчитывать число элементов, равных минимуму. Для каждого элемента вектора мы должны проделать следующее: 1. Сравнить элемент с текущим значением минимума. 2. Если элемент меньше, присвоить текущему минимуму значение элемента и сбросить счетчик в 1. 3. Если элемент равен текущему минимуму, увеличить счетчик на 1. 4. В противном случае ничего не делать. 5. После проверки последнего элемента вернуть значение минимума и счетчика. if ( minVal > ivec[ i ] )... новое значение minVal Необходимо использовать две инструкции if: if ( minVal == ivec[ i ] )... одинаковые значения Довольно часто программист забывает использовать фигурные скобки, если нужно if ( minVal > ivec[ i ] ) minVal = ivec[ i ]; выполнить несколько инструкций в зависимости от условия: occurs = 1; не относится к if! Такую ошибку трудно увидеть, поскольку отступы в записи подразумевают, что и minVal=ivec[i], и occurs=1 входят в одну инструкцию if. На самом же деле инструкция occurs = 1; не является частью if и выполняется безусловно, всегда сбрасывая occurs в 1. Вот как должна быть составлена правильная if-инструкция (точное положение открывающей фигурной скобки является поводом для бесконечных споров): Область видимости объекта, объявленного в условной части, ограничивается ассоциированной с if инструкцией или блоком. Например, такой код вызывает ошибку if ( minVal > ivec[ i ] ) { minVal = ivec[ i ]; occurs = 1; if ( minVal == ivec [ i ] ) Вторая инструкция if выглядит так: ++occurs; Заметим, что порядок следования инструкций в этом примере крайне важен. Если мы будем сравнивать minVal именно в такой последовательности, наша функция всегда if ( minVal > ivec[ i ] ) { minVal = ivec[ i ]; occurs = 1; если minVal только что получила новое значение, то occurs будет на единицу больше, чем нужно if ( minVal == ivec[ i ] ) будет ошибаться на 1: ++occurs; Выполнение второго сравнения не обязательно: один и тот же элемент не может одновременно быть и меньше и равен minVal. Поэтому появляется необходимость выбора одного из двух блоков в зависимости от условия, что реализуется инструкцией if ( условие ) инструкция1 else if-else, второй формой if-инструкции. Ее синтаксис выглядит таким образом: инструкция2 инструкция1 в1нолняется, если условие истинно, иначе переходим к инструкция2. if ( minVal == ivec[ i ] ) ++occurs; else if ( minVal > ivec[ i ] ) { minVal = ivec[ i ]; occurs = 1; Например: if ( minVal < ivec[ i ] ) {} пустая инструкция else if ( minVal > ivec[ i ] ) { minVal = ivec[ i ]; occurs = 1; else minVal == ivec[ i ] В следующем примере выполняется одна из трех инструкций: ++occurs; Составные инструкции if-else могут служить источником неоднозначного толкования, если частей else больше, чем частей if. К какому из if отнести данную часть else? if ( minVal <= ivec[ i ] ) if ( minVal == ivec[ i ] ) ++occurs; else { minVal = ivec[ i ]; occurs = 1; (Эту проблему иногда называют проблемой висячего else). Например: Судя по отступам, программист предполагает, что else относится к самому первому, внешнему if. Однако в С++ неоднозначность висячих else разрешается соотнесением их с последним встретившимся if. Таким образом, в действительности предыдущий if ( minVal <= ivec[ i ] ) { if ( minVal == ivec[ i ] ) ++occurs; else { minVal = ivec[ i ]; occurs = 1; фрагмент означает следующее: Одним из способов разрешения данной проблемы является заключение внутреннего if в фигурные скобки: Здесь инструкция2 сама является if-инструкцией. Если minVal меньше ivec[i], никаких действий не производится.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |