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