Унарные операции
С арифметическими бинарными операциями мы сталкиваемся с первого класса школы, а многие и раньше. Это операции с двумя операндами, например:
1 + 2
То есть бинарная (ну или по-русски “двойная”, хотя это не совсем точный перевод) - это операция, в которой задействованы два операнда. Такими операциями являются почти все арифметические операции, такие как сложение, умножение, вычитание и деление.
Унарная операция, как можно догадаться - это операция с одним операндом (“уно” - один). Что же можно сделать с одним операндом? Ну не так уж много. Например, вот это:
-1
самая что ни на есть унарная операция. С помощью оператора - в данном случае мы из положительного числа делаем отрицательное. А вообще этот оператор меняет знак числа на противоположный. Например:
int x = -1; -x; //x = -1 x = -x; //x = 1
Обратите внимание, что во второй строке кода значение переменной х не изменяется,
хотя мы применили унарный оператор, который вроде как должен поменять знак. Но этого не происходит,
потому что данный оператор меняет знак значения переменной, но не меняет само значение, и х остаётся отрицательным. А вот если мы запишем результат унарной операции в переменную, то тогда уже знак поменяется на противоположный.
Кстати, в Паскале, например, вторая строчка будет вообще недопустима - компилятор выдаст ошибку.
Унарный оператор + также имеется, но он особого смысла в нём нет, так как он ничего не делает с операндом.
В С++ и других подобных языках (например, в JavaScript)
есть ещё две унарные операции: ++ и ––. Это операции инкремента (++)
и декремента (––). Операторы инкремента, в отличие от операторов + и -, могут находиться как перед переменной (префиксная форма), так и после неё (постфиксная форма).
Рассмотрим для примера оператор инкремента (декремент работает также).
int a, b, c; a = 10; b = ++a; //a = 11, b = 11 a = 10; c = a++; //a = 11, c = 10
Здесь наглядно показано отличие в работе между префиксной и постфиксной формой записи.
В префиксной форме сначала выполняется унарная операция, а потом возвращается новое значение
переменной (результат этой операции). Поэтому и а и b равны 11.
В постфиксной записи сначала возвращается значение переменной (старое значение),
и только потом выполняется унарная операция (в примере это операция инкремента).
Поэтому значение а увеличивается и равно 11, а значение b равно 10.
Вот так тоже делать можно:
c++;
То есть не обязательно присваивать результат операции какой-то переменной, так как эта операция записывает результат в переменную, к которой она применяется.
В Паскале тоже можно выполнять инкремент и декремент. Только там нет для этого унарных операций - там используются функции Inc и Dec соответственно. С одной стороны, это не так красиво и менее удобно. С другой - возможности этих функций шире, чем у унарных операций.
Зачем вообще придумали унарные операции и специальные функции для увеличения числа на единицу? Ведь можно было сделать просто так:
х = х + 1;
что привело бы к такому же результату.
Да, это так. Но разработчики языков заметили, что программисты увеличивают или уменьшают число на 1 намного чаще, чем на любую другую константу. Это используется для счётчиков, в циклах и т.п. А когда вы пишите программы из миллиона строк, то даже сэкономленные доли секунды, которые вы тратите на печатание одного символа, в итоге складываются в сэкономленные минуты, часы, дни…
Кроме того, большинство процессоров выполняют операцию инкремента быстрее, чем операцию сложения/вычитания. А во времена создания С++ мощность процессоров была невелика, и это тоже имело значение.
Ну что же. На этом всё. Подписывайтесь на новости, чтобы ничего не пропустить.