Аддитивные операторы: + и -

Синтаксис

expression + expression
expression - expression

Замечания

Ниже перечислены аддитивные операторы.

  • сложения (+);

  • вычитания (-).

Эти бинарные операторы имеют ассоциативность слева направо.

Аддитивные операторы принимают операнды арифметических типов или типов указателей. Результатом оператора добавления (+) является сумма операндов. Результатом оператора вычитания (-) является разница между операндами. Если один или оба операнда являются указателями, они должны быть указателями на объекты, а не на функции. Когда оба операнда являются указателями, результаты имеют смысл только в том случае, если оба операнда указывают на объекты в одном массиве.

Аддитивные операторы принимают операнды арифметических, целочисленных и скалярных типов. Они описаны в следующей таблице.

Типы, используемые с аддитивными операторами

Тип Значение
Арифметические Целочисленные типы и типы с плавающей запятой собирательно называются "арифметическими" типами.
Интеграл Типы char и int всех размеров (long, short), а также перечисления называются "целочисленными типами".
Скалярные Скалярные операнды — это операнды арифметического типа или типа указателя.

Допускаются следующие сочетания этих операторов:

арифметический арифметический +

скалярный + целочисленный

целочисленный + скалярный

арифметический арифметический -

скалярный скаляр -

Обратите внимание, что сложение и вычитание не являются эквивалентными операциями.

Если оба операнда имеют арифметический тип, преобразования, описанные в стандартных преобразованиях , применяются к операндам, а результатом является преобразованный тип.

Пример

// expre_Additive_Operators.cpp
// compile with: /EHsc
#include <iostream>
#define SIZE 5
using namespace std;
int main() {
   int i = 5, j = 10;
   int n[SIZE] = { 0, 1, 2, 3, 4 };
   cout  << "5 + 10 = " << i + j << endl
         << "5 - 10 = " << i - j << endl;

   // use pointer arithmetic on array

   cout << "n[3] = " << *( n + 3 ) << endl;
}

Добавление указателей

Если один из операндов в операции сложения является указателем на массив объектов, другой должен иметь целочисленный тип. Результатом является указатель, имеющий тот же тип, что и исходный указатель, и указывающий на другой элемент массива. Эта концепция проиллюстрирована в следующем фрагменте кода.

short IntArray[10]; // Objects of type short occupy 2 bytes
short *pIntArray = IntArray;

for( int i = 0; i < 10; ++i )
{
    *pIntArray = i;
    cout << *pIntArray << "\n";
    pIntArray = pIntArray + 1;
}

Несмотря на то что целочисленное значение 1 добавляется в pIntArray, это не означает "добавить 1 к адресу"; скорее, это означает "скорректировать указатель так, чтобы он указывал на следующий объект в массиве", то есть через 2 байта (или sizeof( int )).

Примечание.

Код формы pIntArray = pIntArray + 1 редко можно найти в программах на C++; чтобы выполнить пошаговое увеличение, предпочтительно использовать следующие формы: pIntArray++ или pIntArray += 1.

Вычитание указателей

Если оба операнда являются указателями, то результатом вычитания будет число элементов массива, находящихся между операндами. Выражение вычитания дает подписанный целочисленный результат типа ptrdiff_t (определенный в стандартном формате stddef.h><).

Второй операнд может иметь целочисленное значение. Результат вычитания имеет тот же тип, что и исходный указатель. Значение вычитания — это указатель на элемент массива (n - i)th, где n является элементом, на который указывает исходный указатель, и я является целочисленным значением второго операнда.

См. также

Выражения с бинарными операторами
Операторы C++, приоритет и ассоциативность
Аддитивные операторы в C