Раздел: Статьи / С/С++ / Ошибки программирования /

Унарные операторы

Все способы изучить С++ Все способы изучить С++

Начинающие программисты даже не догадываются о том, какой огромный пласт в этой области скрыт от их глаз, и чего многие из новичков не увидят никогда, потому что это тёмная сторона программирования - чистый исходный код системного уровня… Подробнее...

Если вы хотя бы немного знаете С++, то вы, конечно, также знаете о существовании унарных операций и операторов. Основные унарные операторы приведены ниже:

Оператор   Операция
---------------------------------
   +       Тождество
   -       Отрицание
   --      Декремент (уменьшение)
   ++      Инкремент (увеличение)

Знаки + и - используются также как и в математике. Например,

 
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

Не буду объяснять этот пример. Если хотите знать больше об указателях в С++, то читайте своей книгу Основы С++. Если хотите знать больше об указателях вообще, то изучайте курс Куда указывают указатели.


Как стать программистом 2.0 Как стать программистом 2.0

Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки… Подробнее...

Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

Яндекс.Метрика