Программирование >>  Инициализация объектов класса, структура 

1 ... 60 61 62 [ 63 ] 64 65 66 ... 395


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], никаких действий не производится.



1 ... 60 61 62 [ 63 ] 64 65 66 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика