ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 3) онлайн

Условия с присваиванием

Можно переписать программу CHCOUNT, сократив ее на одну строку и продемон- стрировав важные аспекты, касающиеся присваивания и старшинства операций. Получившаяся в результате конструкция может показаться необычной, однако на самом деле она часто употребляется не только в C++, но даже в С.

Приведем измененную версию предыдущей программы, названную CHCNT2:

// chcnt2.cpp

// подсчет числа слов и символов в строке

#include <iostream>

using namespace std;

#include <conio.h>           // для getche()

int main()

{

  int chcount = 0;

  int wdcount = 1;           // пробел между двумя словами

  char ch;

  while((ch=getche()) != '\r') // цикл, пока не нажата клавиша Enter

  {

    if (ch == ' ')           // если введен пробел,

    wdcount++;               // инкрементировать счетчик слов

    else                     // иначе

    chcount++;               // инкрементировать число символов

  }                          // вывод результатов

  cout << "\nСлов: " << wdcount << endl;

  cout << "Букв: " << chcount << endl;

  return 0;

}

Значение, возвращаемое функцией getche(), присваивается переменной ch, как и раньше, но сама операция присваивания находится прямо внутри условия цикла while. Присвоенное значение сравнивается с '\r' для того, чтобы выяснить, продолжать выполнение цикла или нет. Эта конструкция работает правильно, потому что операция присваивания значения сама получает это значение. Если, к примеру, функция getche() возвращает символ 'a', то при этом не только про- исходит присваивание значения 'a' переменной ch, но само выражение

(ch=getche())

получает значение, равное 'a', которое участвует в проверке.

Тот факт, что операции присваивания имеют собственное значение, приме- няется при множественном присваивании, таком, как

                int x,y,z;              x=у=z=0;

Подобные конструкции являются абсолютно корректными в C++. Сначала переменной z присваивается значение 0, которое затем присваивается перемен- ной у. После этого выражение y=z=0 получает значение 0, которое присваивается переменной x.

Внешние круглые скобки в выражении (ch=getche())

необходимы, поскольку операция присваивания = имеет более низкий приори- тет, чем операция отношения !=. Если бы скобки отсутствовали, то выражение

while( (ch=getche()) != '\r')

присваивало бы истинное или ложное значение переменной ch, что было бы не- правильно для нашего алгоритма.

Таким образом, оператор while в программе CHCNT2 выполняет много полез- ных действий. Он не только проверяет, является ли значение переменной ch символом '\r', но еще получает символ с клавиатуры и присваивает его перемен- ной ch. Непросто с одного взгляда понять все действия этого оператора.

 

29