Содержание

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

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

Унарные

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

Такие выражения могут быть представлены и так: 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. Если кроме префиксной формы инкремента или декремента, в строке есть еще какая-либо команда, то все команды в строке выполняются справа налево согласно приоритету операторов.

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

Префиксный инкремент изменяет переменную, а затем использует её. Постфиксный инкримент - возвращает значение, которое можно использовать в выражении, а потом уже увеличивает ее на единицу.

Бинарные

Тернарные

Алгоритм работы операции следующий: Вычисляется условие (логическое выражение).Если логическое выражение истинно, то вычисляется значение выражения выражение 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++ тернарная условная операция имеет тот же синтаксис, что и в Си.[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 инициализируется в момент объявления результатом работы тернарной операции. Подобного эффекта не удалось бы достичь простым присваиванием в том или ином случае.