Согласие на обработку персональных данных.



04.09.2017
Новая задача Программа вычисления суммы.

03.09.2017
Новое видео Стековый калькулятор и обратная польская запись.

26.08.2017
Новая статья Версии Делфи.

23.08.2017
Новая статья Для кого пишется программа.

13.08.2017
Новая статья Стандарт C++: общие сведения.

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

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

Основы C++ Основы C++

C++ - это один из самых популярных языков программирования. Не важно, на каком языке программируете лично вы. Но, если вы хотя бы в общих чертах не знаете С++, то это большой пробел в вашем образовании, который надо восполнить как можно быстрее... Подробнее...

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

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

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

 
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

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



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

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