Раздел: Статьи / С/С++ / Ошибки программирования /
Унарные операторы
Все способы изучить С++
Начинающие программисты даже не догадываются о том, какой огромный пласт в этой области скрыт от их глаз, и чего многие из новичков не увидят никогда, потому что это тёмная сторона программирования - чистый исходный код системного уровня… Подробнее... |
Если вы хотя бы немного знаете С++, то вы, конечно, также знаете о существовании унарных операций и операторов. Основные унарные операторы приведены ниже:
Оператор Операция --------------------------------- + Тождество - Отрицание -- Декремент (уменьшение) ++ Инкремент (увеличение)
Знаки + и - используются также как и в математике. Например,
y = +y; х = -y;
А вот инкремент и декремент требуют отдельного разговора. Подробно об этом я рассказал в своей книге Основы С++. Если подзабыли, то либо перечитайте (если книга у вас есть), либо поищите информацию в других источниках.
Здесь же я буду говорить только о возможных ошибках, которые совершают новички при работе с унарными операциями, такими как декремент (уменьшение) и инкремент (увеличение).
Если вы знакомы с Паскалем, то вы должны знать, что там есть функции Inc и Dec, которые, соответственно, увеличивают и уменьшают значение переданной в функцию переменной.
В С/С++ механизмы инкремента и декремента несколько иные. Например, чтобы увеличить значение переменной х на единицу, нужно всего лишь записать:
int x = 100; х++; //х = 101
Но и это ещё не всё. Такой же результат будет в этом коде:
int x = 100; ++х; //х = 101
То есть оператор инкремента и декремента можно помещать как перед переменной, так и после неё. Вот в этом то и проблема!
Потому что от места размещения оператора инкремента/декремента зависит его поведение.
В чём разница? Два примера:
x = ++x; cout << x << endl; //х = 101
и
x = x++; cout << x << endl; //х = 100
Почему в первом случае на экран будет выведено число 101, а во втором - 100?
Потому что при такой записи:
x = ++x;
сначала выполняется операция инкремента, а потом - операция присваивания. То есть эквивалентный код этой записи будет:
х = (х + 1);
А вот при такой записи:
x = x++;
сначала выполняется операция присваивания, а потом - операция инкремента. То есть этот код эквивалентен следующему:
(х = х) + 1;
ПРИМЕЧАНИЕ
Это лишь пример для понимания ситуации. Такой код не является правильным с точки зрения С++
То есть в этом случае операция инкремента выполняется, но она уже нигде не сохраняется. Чтобы она сохранилась в переменной х, надо записать так:
х++;
Эти нюансы надо учитывать и в других выражениях. Например, при выводе на экран:
х = 100; cout << x++ << endl; //x = 100 cout << x << endl; //x = 101
Несмотря на то, что во второй строке мы увеличиваем х на единицу, на экран будет выведено число 100, так как вывод на экран выполняется до того, как будет выполнена операция инкремента.
И всё-таки операция инкремента будет выполнена. В этом можно убедиться в третьей строке кода, где мы ничего не делаем с х, но на экран выводится число 101.
В листинге ниже приведён пример программы с комментариями, над которой я вам рекомендую немного поразмышлять, чтобы окончательно понять, как работают операторы инкремента и декремента.
#include#include using namespace std; int main(int argc, char *argv[]) { int x = 100; x = x++; cout << x << endl; //x = 100 x = ++x; cout << x << endl; //x = 101 x--; cout << x << endl; //x = 100 cout << x++ << endl; //x = 100 cout << x << endl; //x = 101 x--; cout << x << endl; //x = 100 cout << ++x << endl; //x = 101 cout << x << endl; //x = 101 system("PAUSE"); return EXIT_SUCCESS; }
Оператор декремента работает аналогично, только не увеличивает значение, а уменьшает его.
И это ещё не всё…
Инкремент и декремент в Си
Операторы инкремента и декремента в Си и в С++ (впрочем, как и в большинстве других языков) имеют одну особенность. Они увеличивают значение операнда не на единицу, как это думают новички, а на значение, кратное единице!
Для целых чисел это будет 1.
А вот, например, для указателя – это может быть другое число!
int* P1; cout << (int)P1 << endl; //Выведет 0 P1++; //Увеличиваем указатель на единицу cout << (int)P1 << endl; //Выведет 4
Не буду объяснять этот пример. Если хотите знать больше об указателях в С++, то читайте своей книгу Основы С++. Если хотите знать больше об указателях вообще, то изучайте курс Куда указывают указатели.
Подписаться на канал в YouTube
Вступить в группу "Основы программирования" Подписаться на рассылки по программированию |
Как стать программистом 2.0
Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки… Подробнее... |