// определяющая сразу два объекта
vectorstring::iterator iter = text.begin(),
lend = text.end();
Эквивалентная пара, определяющая по одному объекту, выглядит так:
vectorstring::iterator iter = text.begin();
vectorstring::iterator lend = text.end();
Хотя определение одного или нескольких объектов в одном предложении является скорее вопросом вкуса, в некоторых случаях – например, при одновременном определении объектов, указателей и ссылок – это может спровоцировать появление ошибок. Скажем, в следующей инструкции не совсем ясно, действительно ли программист хотел определить указатель и объект или просто забыл поставить звездочку перед вторым идентификатором (используемые имена переменных наводят на второе предположение):
// то ли хотел определить программист?
string *ptrl, ptr2;
Эквивалентная пара инструкций не позволит допустить такую ошибку:
string *ptr1;
string *ptr2;
В наших примерах мы обычно группируем определения объектов в инструкции по сходству употребления. Например, в следующей паре
int aCnt=0, eCnt=0, iCnt=0, oCnt=0, uCnt=0;
int charCnt=0, wordCnt=0;
первая инструкция объявляет пять очень похожих по назначению объектов – счетчиков пяти гласных латинского алфавита. Счетчики для подсчета символов и слов определяются во второй инструкции. Хотя такой подход нам кажется естественным и удобным, нет никаких причин считать его хоть чем-то лучше других.
Представьте себе, что вы являетесь руководителем программного проекта и хотите, чтобы применение инструкций объявления было унифицировано. Сформулируйте правила использования объявлений объектов для вашего проекта.
Представьте себе, что вы только что присоединились к проекту из предыдущего упражнения. Вы совершенно не согласны не только с конкретными правилами использования инструкций объявления, но и вообще с навязыванием каких-либо правил для этого. Объясните свою позицию.
5.3. Инструкция if
Инструкция if обеспечивает выполнение или пропуск инструкции или блока в зависимости от условия. Ее синтаксис таков:
if ( условие )
инструкция
условие заключается в круглые скобки. Оно может быть выражением, как в этом примере:
if(a+bc) { ... }
или инструкцией объявления с инициализацией:
if ( int ival = compute_value() ){...}
Область видимости объекта, объявленного в условной части, ограничивается ассоциированной с if инструкцией или блоком. Например, такой код вызывает ошибку компиляции:
if ( int ival = compute_value() ) {
// область видимости ival
// ограничена этим блоком
}
// ошибка: ival невидим
if ( ! ival ) ...
Попробуем для иллюстрации применения инструкции if реализовать функцию min(), возвращающую наименьший элемент вектора. Заодно наша функция будет подсчитывать число элементов, равных минимуму. Для каждого элемента вектора мы должны проделать следующее:
* Сравнить элемент с текущим значением минимума.
* Если элемент меньше, присвоить текущему минимуму значение элемента и сбросить счетчик в 1.
* Если элемент равен текущему минимуму, увеличить счетчик на 1.
* В противном случае ничего не делать.
* После проверки последнего элемента вернуть значение минимума и счетчика.
Необходимо использовать две инструкции if:
if ( minVal ivec[ i ] )...// новое значение minVal
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 ( minVal ivec[ i ] )
{
minVal = ivec[ i ];
occurs = 1;
}
Вторая инструкция if выглядит так:
if ( minVal == ivec [ i ] )
++occurs;
Заметим, что порядок следования инструкций в этом примере крайне важен. Если мы будем сравнивать minVal именно в такой последовательности, наша функция всегда будет ошибаться на 1: