Операторы С++

Оператор – конструкция языка позволяющая производить различные действия над данными, приводящие к определенному результату.

Унарные

  • Унарные – операторы, которым необходим, только один операнд (данные, над которыми производится действие). С примером унарного оператора вы уже знакомы из курса школьной математики – унарный минус, который позволяет превратить число в отрицательное (3 и -3), или положительное ( –(-3)). Т. е. общий синтаксис унарного оператора таков:
    оператор операнд;       или      операнд оператор;

Инкремент и декремент.

  • Инкремент – обозначается конструкцией ++. Данный оператор увеличивает содержимое любой переменной на единицу и перезаписывает значение переменной. Например,
    int a=8;
    cout<<a; // на экране число 8
    a++;
    cout<<a; // на экране число 9
  • Декремент – обозначается конструкцией –. Данный оператор уменьшает содержимое любой переменной на единицу и перезаписывает значение переменной. Например,
    int a=8;
    cout<<a; // на экране число 8
    a--;
    cout<<a; // на экране число 7

Такие выражения могут быть представлены и так: a=a+1 или a=a-1. синтаксис унарного оператора, может быть не только таким

операнд оператор;

, но и таким

оператор операнд;

Такие формы записи носят название постфиксной, (оператор располагается после значения) и префиксной (оператор располагается до значения). И инкремент, и декремент обладают обеими формами. Давайте разберемся, какие есть различия между формами, и в каких случаях эти различия имеют значение.

Пример 1.
int a=8;
cout<<a; // на экране число 8
a++;
cout<<a; // на экране число 9
++a;
cout<<a; // на экране число 10

В данном примере нет никакой разницы, между префиксной и постфиксной формой. И в первом и во втором случае значение переменной а просто увеличивается на единицу. Смысл использования различных форм оператора появляется только тогда, когда в строке кроме самого оператора, есть еще какая-нибудь команда.

Пример 2.
int a=8;
cout<<++a; // на экране число 9
cout<<a++; // на экране число 9
cout<<a; // на экране число 10

Прежде чем разбирать пример, давайте установим три правила:

  1. Все команды в языке С выполняются справа налево.
  2. Если кроме постфиксной формы инкремента или декремента, в строке есть еще какая-либо команда, то сначала выполняется эта команда, и только потом инкремент или декремент независимо от расположения команд в строке.
  3. Если кроме префиксной формы инкремента или декремента, в строке есть еще какая-либо команда, то все команды в строке выполняются справа налево согласно приоритету операторов.

Теперь более подробно о примере:

  • Изначально значение переменной равно числу 8.
  • Команда cout«++a; содержит префиксную форму оператора инкремент, следовательно, используя третье правило, описанное выше, мы сначала увеличиваем значение переменной а на единицу, а затем показываем его на экран с помощью команды cout«.
  • Команда cout«a++; содержит постфиксную форму оператора инкремент, следовательно, используя второе правило, описанное выше, мы сначала показываем значение переменной (всё еще 9) на экран с помощью команды cout«, а затем увеличиваем значение переменной a на единицу.
  • При выполнении следующей команды cout«a; будет показано уже измененное (увеличенное) значение, то есть число 10.
Префиксный инкремент изменяет переменную, а затем использует её. Постфиксный инкримент - возвращает значение, которое можно использовать в выражении, а потом уже увеличивает ее на единицу.

Бинарные

Тернарные

  • Тернарные - операторы, которым необходимо три операнда.
    условие ? выражение1 : выражение2

Алгоритм работы операции следующий: Вычисляется условие (логическое выражение).Если логическое выражение истинно, то вычисляется значение выражения выражение 1, в противном случае — значение выражения выражение 2. Вычисленное значение возвращается. Нужно обратить внимание, что вычисляется только одно из выражений: выражение 1 или выражение 2. Второй и третий операнды, то есть <выражение1> и <выражение2>, должны возвращать значения одного типа и не должны иметь тип void.

  • Си

В Си тернарная операция имеет следующий синтаксис:[2]

o1 ? o2 : o3

Как известно, в Си нет логического типа данных. Поэтому операнд o1 должен быть числом (целым или вещественным) или указателем. Сначала вычисляется именно его значение. Оно сравнивается с нулём и, если оно не равно нулю, вычисляется и возващается o2, в случае равенства — o3. Операнды o2 и o3 могут быть различных, вообще говоря, несовпадающих типов, включая void. В следующем примере вычисляется минимальное из чисел a и b:

min = (a < b) ? a : b;
  • C++

В C++ тернарная условная операция имеет тот же синтаксис, что и в Си.[3] Однако за счёт наличия разницы между инициализацией и присваиванием, бывают ситуации, когда операцию ?: нельзя заменить конструкцией if-then-else, как, например, в следующем случае:

#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
int main(int argc, char** argv)
{
    string name;
    ofstream fout;
    if (argc > 1 && argv[1])
    {
        name = argv[1];
        fout.open(name.c_str(), ios::out | ios::app);
    }
    ostream& sout = name.empty() ? cout : fout;
    return 0;
}

Здесь переменная sout инициализируется в момент объявления результатом работы тернарной операции. Подобного эффекта не удалось бы достичь простым присваиванием в том или ином случае.

PQ VPS сервера в 28+ странах.