Различия

Показаны различия между двумя версиями страницы.


Предыдущая версия
operatory [2025/07/06 12:39] (текущий) – внешнее изменение 127.0.0.1
Строка 1: Строка 1:
 +====== Операторы С++ ======
 +~~Title: Операторы С++ ~~
 +**Оператор** – конструкция языка позволяющая производить различные действия над данными, приводящие к определенному результату.
  
 +====== Унарные ======
 +  * **Унарные** – операторы, которым необходим, только один операнд (данные, над которыми производится действие). С примером унарного оператора вы уже знакомы из курса школьной математики – унарный минус, который позволяет превратить число в отрицательное (3 и -3), или положительное ( –(-3)). Т. е. общий синтаксис унарного оператора таков:<file>
 +оператор операнд;       или      операнд оператор;
 +</file>
 +**Инкремент и декремент**.
 +
 +  * **Инкремент** – обозначается конструкцией ++. Данный оператор увеличивает содержимое любой переменной на единицу и перезаписывает значение переменной. Например,<file>
 +int a=8;
 +cout<<a; // на экране число 8
 +a++;
 +cout<<a; // на экране число 9
 +</file>
 +
 +  * **Декремент** – обозначается конструкцией --. Данный оператор уменьшает содержимое любой переменной на единицу и перезаписывает значение переменной. Например,<file>
 +int a=8;
 +cout<<a; // на экране число 8
 +a--;
 +cout<<a; // на экране число 7
 +</file>
 +Такие выражения могут быть представлены и так: a=a+1 или a=a-1. синтаксис унарного оператора, может быть не только таким
 +<file>
 +операнд оператор;
 +</file>, но и таким <file>
 +оператор операнд;
 +</file>
 +Такие формы записи носят название **постфиксной**, (оператор располагается после значения) и **префиксной** (оператор располагается до значения). И инкремент, и декремент обладают обеими формами. Давайте разберемся, какие есть различия между формами, и в каких случаях эти различия имеют значение.
 +<file>
 +Пример 1.
 +int a=8;
 +cout<<a; // на экране число 8
 +a++;
 +cout<<a; // на экране число 9
 +++a;
 +cout<<a; // на экране число 10
 +</file>
 +В данном примере нет никакой разницы, между префиксной и постфиксной формой. И в первом и во втором случае значение переменной а просто увеличивается на единицу. Смысл использования различных форм оператора появляется только тогда, когда в строке кроме самого оператора, есть еще какая-нибудь команда. 
 +<file>
 +Пример 2.
 +int a=8;
 +cout<<++a; // на экране число 9
 +cout<<a++; // на экране число 9
 +cout<<a; // на экране число 10
 +</file>
 +Прежде чем разбирать пример, давайте установим три правила:
 +  - Все команды в языке С выполняются справа налево.
 +  - Если кроме постфиксной формы инкремента или декремента, в строке есть еще какая-либо команда, то сначала выполняется эта команда, и только потом инкремент или декремент независимо от расположения команд в строке.
 +  - Если кроме префиксной формы инкремента или декремента, в строке есть еще какая-либо команда, то все команды в строке выполняются справа налево согласно приоритету операторов.
 +
 +Теперь более подробно о примере:
 +  * Изначально значение переменной равно числу 8.
 +  * Команда cout<<++a; содержит префиксную форму оператора инкремент, следовательно, используя третье правило, описанное выше, мы сначала увеличиваем значение переменной а на единицу, а затем показываем его на экран с помощью команды cout<<.
 +  * Команда cout<<a++; содержит постфиксную форму оператора инкремент, следовательно, используя второе правило, описанное выше, мы сначала показываем значение переменной (всё еще 9) на экран с помощью команды cout<<, а затем увеличиваем значение переменной a на единицу.
 +  * При выполнении следующей команды cout<<a; будет показано уже измененное (увеличенное) значение, то есть число 10.
 +<note>**Префиксный инкремент** изменяет переменную, а затем использует её. Постфиксный инкримент - возвращает значение, которое можно использовать в выражении, а потом уже увеличивает ее на единицу.</note>
 +====== Бинарные ======
 +  * **Бинарные** – операторы, которым необходимо два операнда слева и справа от оператора, например: +, -,*, [[%-деление по модулю]] и т. д. И их общий синтаксис можно изобразить следующим образом:<file>
 +операнд оператор операнд;
 +</file>
 +====== Тернарные ======
 +  * [[http://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D1%80%D0%BD%D0%B0%D1%80%D0%BD%D0%B0%D1%8F_%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F|Тернарная условная операция Материал из Википедии]]
 +
 +  * **Тернарные** - операторы, которым необходимо три операнда.<file>
 +условие ? выражение1 : выражение2
 +</file>
 +Алгоритм работы операции следующий:
 +Вычисляется условие (логическое выражение).Если логическое выражение истинно, то вычисляется значение выражения выражение 1, в противном случае — значение выражения выражение 2. Вычисленное значение возвращается. Нужно обратить внимание, что вычисляется только одно из выражений: выражение 1 или выражение 2. Второй и третий операнды, то есть <выражение1> и <выражение2>, **должны возвращать значения одного типа и не должны иметь тип void**.
 +
 +  * **Си**
 +В Си тернарная операция имеет следующий синтаксис:[2]
 +<file>
 +o1 ? o2 : o3
 +</file>
 +Как известно, в Си нет логического типа данных. Поэтому операнд o1 должен быть числом (целым или вещественным) или указателем. Сначала вычисляется именно его значение. Оно сравнивается с нулём и, если оно не равно нулю, вычисляется и возващается o2, в случае равенства — o3. Операнды o2 и o3 могут быть различных, вообще говоря, несовпадающих типов, включая void.
 +В следующем примере вычисляется минимальное из чисел a и b:
 +<file>
 +min = (a < b) ? a : b;
 +</file>
 +  * **C++**
 +В C++ тернарная условная операция имеет тот же синтаксис, что и в Си.[3] Однако за счёт наличия разницы между инициализацией и присваиванием, бывают ситуации, когда операцию ?: нельзя заменить конструкцией if-then-else, как, например, в следующем случае:
 +<file>
 +#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;
 +}
 +</file>
 +Здесь переменная sout инициализируется в момент объявления результатом работы тернарной операции. Подобного эффекта не удалось бы достичь простым присваиванием в том или ином случае.

📌 Удобный подбор VPS по параметрам доступен на DIEGfinder.com - официальном инструменте проекта DIEG. Это часть единой экосистемы, созданной для того, чтобы помочь быстро найти подходящий VPS/VDS сервер для любых задач хостинга.

📌 Для тестирования скриптов, установщиков VPN и Python-ботов рекомендуем использовать надежные VPS на короткий срок. Подробнее о быстрой аренде VPS для экспериментов - читайте здесь.

💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!