cin >> name; // оператор >> считывает строку в переменную name
int c2 = count+2; // оператор + складывает целые числа
string s2 = name + " Jr. "; // оператор + добавляет символы
int c3 = count–2; // оператор – вычитает целые числа
string s3 = name – "Jr. "; // ошибка: оператор – для строк не определен
int age = –100;
Очевидно, что человек не может иметь отрицательный возраст (хотя почему бы и нет?), но никто не сказал компилятору об этом, поэтому он успешно создаст код для этого определения. Приведем таблицу полезных операторов для наиболее распространенных типов.
Пустые ячейки означают, что операция не может применяться к данному типу непосредственно (хотя существует множество косвенных способов их использования; см. раздел 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
.
Для типа string
предусмотрено меньше операций, но, как будет показано в главе 23, для него создано много специальных функций. Тем не менее к ним можно применять обычные операторы, как показано в следующем примере:
// ввод имени и отчества
int main()
{
cout << "Пожалуйста, введите свое имя и отчество \n";
string first;
string second;
cin >> first >> second; // считываем две строки
string name = first + ' ' + second; // конкатенируем строки
cout << "Hello, " << name << '\n';
}
Для строк оператор +
означает конкатенацию; иначе говоря, если переменные s1
и s2
имеют тип string
, то s1+s2
является строкой, в которой вслед за символами строки s1
следуют символы строки s2
. Например, если строка s1
имеет значение "Hello
", а строка s2
— значение "World
", то s1+s2
содержит значение "HelloWorld
". Особенно полезным является сравнение строк.