Литмир - Электронная Библиотека
A
A

Hello, 22 (age –1)

Обратите внимание на то, что мы можем одним оператором ввода ввести одновременно несколько значений, а одним оператором вывода — вывести их на экран. Кроме того, оператор 

<<
, как и оператор 
>>
, чувствителен к типу, поэтому можем вывести переменную 
age
типа 
int
вместе со строковой переменной 
first_name
и строковыми литералами "
Hello,
", "
(age
" и "
\n
" .

 Ввод объекта типа

string
с помощью оператора
>>
(по умолчанию) прекращается, когда обнаруживается разделитель; иначе говоря, оператор
>>
считывает отдельные слова. Однако иногда нам необходимо прочитать несколько слов. Для этого существует много возможностей. Например, можно прочитать имя, состоящее из двух слов.

int main()

{

  cout << "Пожалуйста, введите свое имя и отчество\n";

  string first;

  string second;

  cin >> first >> second; // считываем две строки

  cout << "Hello, " << first << ' ' << second << '\n';

}

Здесь мы просто использовали оператор

>>
дважды, применив его к каждому из слов. Если требуется вывести эти слова на экран, то между ними следует вставить пробел.

ПОПРОБУЙТЕ

Запустите программу “имя и возраст”. Измените ее так, чтобы она выводила возраст, измеренный месяцами: введите возраст, выраженный в годах, и умножьте это число на 12 (используя оператор

*
). Запишите возраст в переменную типа 
double
, чтобы дети могли гордиться, что им пять с половиной, а не пять лет.

3.4. Операции и операторы

Кроме значений, которые могут храниться в переменной, ее тип определяет также операции, которые можно применять к ней, и их смысл. Рассмотрим пример.

int count;

cin >> count;               // оператор >> считывает целое число в объект count

string name;

cin >> name;                // оператор >> считывает строку в переменную name

int c2 = count+2;           // оператор + складывает целые числа

string s2 = name + " Jr. "; // оператор + добавляет символы

int c3 = count–2;           // оператор – вычитает целые числа

string s3 = name – "Jr. ";  // ошибка: оператор – для строк не определен

 

Программирование. Принципы и практика использования C++ Исправленное издание - _003.png
 Под ошибкой мы подразумеваем то, что компилятор откажется компилировать программу, пытающуюся вычитать строки. Компилятор точно знает, какие операции можно применять к каждой из переменных, и, следовательно, может предотвратить любые ошибки. Однако компилятор не знает, какие операции имеют смысл для тех или иных переменных, поэтому охотно допускает выполнение легальных операций, приводящих к абсурдным результатам. Рассмотрим пример.

int age = –100;

Очевидно, что человек не может иметь отрицательный возраст (хотя почему бы и нет?), но никто не сказал компилятору об этом, поэтому он успешно создаст код для этого определения. Приведем таблицу полезных операторов для наиболее распространенных типов.

Программирование. Принципы и практика использования C++ Исправленное издание - _021.png

Пустые ячейки означают, что операция не может применяться к данному типу непосредственно (хотя существует множество косвенных способов их использования; см. раздел 3.9.1). Со временем мы объясним все эти операции. Дело в том, что существует множество полезных операций и их смысл у схожих типов почти одинаков.

Рассмотрим пример, в котором фигурируют числа с плавающей точкой.

// простая программа, демонстрирующая работу операторов

int main()

{

  cout << "Пожалуйста, введите значение с плавающей точкой: ";

  double n;

  cin >> n;

  cout << "n == " << n

  << "\nn+1 == " << n+1

  << "\n три раза по n == " << 3*n

  << "\n два раза по n == " << n+n

  << "\nn в квадрате == " << n*n

  << "\n половина n == " << n/2

  << "\n корень квадратный из n == " << sqrt(n)

  << endl; // синоним перехода на новую строку ("end of line")

}

Очевидно, что обычные арифметические операции имеют традиционные обозначения, а их смысл известен нам со школьной скамьи. Естественно также, что не все операции над числами с плавающей точкой реализованы в виде операторов, например квадратный корень можно извлечь лишь с помощью функции. Многие операции представлены именованными функциями. В данном случае для извлечения квадратного корня из числа n используется функция

sqrt(n)
из стандартной библиотеки. Система обозначений близка к математической. Более подробно функции рассматриваются в разделах 4.5 и 8.5.

ПОПРОБУЙТЕ

Запустите эту небольшую программу. Затем измените ее так, чтобы считать значение типа

int
, а не
double
. Обратите внимание на то, что функция
sqrt()
для целых чисел не определена, поэтому присвойте число переменной типа
double
и лишь затем примените к ней функцию
sqrt()
. Кроме того, выполните несколько других операций. Обратите внимание на то, что операция для целых чисел представляет собой целочисленное деление, а операция — вычисление остатка, так что
5/2
равно
2
(а не
2.5
или
3
), а
5%2
равно
1
. Определения целочисленных операций
*
,
/
и
%
гарантируют, что для двух положительных переменных
a
и
b
типа
int
выполняется равенство
a/b*b+a%b==a
.

34
{"b":"847443","o":1}