В предыдущей статье мы с вами рассмотрели бинарные операторы, которые используют для арифметических операций с двумя операндами (переменными). А в этом уроке мы научимся применять унарные операторы, для которых необходим один операнд. Называются они инкремент ( ++ ) и декремент (––). Роль этих операторов в том, чтобы изменить (увеличить или уменьшить соответственно) значение переменной на единицу, при этом значение будет перезаписано. Рассмотрим пример, в котором будем изменять значение переменной variable на единицу тремя различными способами:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <iostream> using namespace std; int main() { setlocale(LC_ALL, "rus"); int variable = 0; cout << variable << endl; variable = variable + 1; // обычный способ cout << variable << " - variable = variable + 1" << endl; variable += 1; // комбинированный оператор += cout << variable << " - variable += 1" << endl; variable++; // используем инкремент ++ cout << variable << " - variable++" << endl; variable--; // используем декремент -- variable--; variable--; cout << variable << " - три раза variable--" << endl; return 0; } |
После каждой операции в строках 11, 13 и 15. к значению переменной variable прибавляется единица. Как вы видите, самая короткая запись – это запись с использованием инкремента. Ниже, в строках 17 – 19, мы трижды применили декремент и в итоге получим значение variable уменьшенное на 3.
Компилируем:
Оба этих унарных оператора могут иметь две формы: постфиксную ( когда оператор расположен сразу за переменной) и префиксную (оператор расположен перед переменной). В рассмотренном примере мы применяли постфиксные формы инкремента и декремента. Чем же отличаются эти формы друг от друга? И первая и вторая формы этих операторов выполняют одинаковые роли – увеличение или уменьшение переменной на единицу. Но если в строке кода, где применяются инкремент или декремент, присутствуют еще какое-либо команды, тогда эти операторы по-разному себя ведут. Постфиксная форма будет применена после выполнения других команд. Посмотрим на следующем примере:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #include <iostream> using namespace std; int main() { setlocale(LC_ALL, "rus"); int variable = 0; // постфиксный инкремент // значение variable увеличится на 1 после показа на экран cout << variable++ << " - результат \"cout << variable++\" " << endl; cout << variable << " - изменённое значение" << endl; // префиксный инкремент // сразу увеличение на 1, потом показ на экран cout << ++variable << " - результат \"cout << ++variable\" " << endl; // та же логика для декремента // постфиксный декремент cout << variable-- << " - результат \"cout << variable--\" " << endl; cout << variable << " - изменённое значение" << endl; // префиксный декремент cout << --variable << " - результат \"cout << --variable\" " << endl; return 0; } |
В результате выполнения кода строки 12, мы увидим на экране число 0. Так произойдет потому, что увеличение на единицу выполнится после вывода значения переменной variable на экран. Чтобы убедиться, что значение действительно изменилось – в строке 13 просим показать нам variable. А вот в случае применения префиксной формы инкремента (строка 16), переменная сразу перезапишется и уже только после этого произойдет вывод на экран. Для декремента всё то же самое, но с уменьшением на единицу.
Компилируем:
Вот посмотрите еще на этот пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <iostream> using namespace std; int main() { setlocale(LC_ALL, "rus"); int variable = 1; int a = 0; a = ++variable + 1 + ++variable * 2; cout << "a = " << a << endl; return 0; } |
Постарайтесь понять, почему в результате операций строки 11, переменная a стала равна 10. Задавать вопросы в комментариях не запрещается.
в с++ не такого понятия, как вначале умножение потом всё остальное.
Есть пример: 1+1*2+1 = 4 (это если по математике считать, вначале умножение..)
а если как в плюсах: 1+1*2+1 = 5 (Всё идёт по порядку 1+1=2*2=4+1=5)
Ясно, понятно?! Пнятненько? Ясненько!?
Это такая шутка на Рождество? ;-)
1+1*2+1 = 4 – это не только в C++, но и во всех нескольких десятках разных языков программирования. Везде!
Я немного не понял..а как это.. когда выполняется первое сложение variable уже 3?
Да. Вначале инкремент увеличивает значение переменной, далее все операции по очереди, как в школе учили.
Опишу более понятно, тк сам долго вникал в суть)
По сути получается как: сначало программа выполняет изменение переменной ( тоесть если ++variable встречается 3 раза, то и значение переменной variable становится равно 4), и только после этого подставляет это полученное значение 4 в наш пример, а далее все идет по математическим законам.
К примеру: [code]
int variable = 1;
int a = 0;
а = ++variable + ++variable + ++variable + ++variable;
cout << "a = " << a < 5+5+5+5=20
Выражения типа показанного – это глупость:
[code]
а = ++variable + ++variable + ++variable + ++variable;
[/code]
[b]Стандарт[/b] языка C++ [b]предупреждает[/b], что результат подобных “экспериментов” [b]непредсказуем и зависит от компилятора[/b], не переносим даже между версиями компилятора, и [b]не должны[/b] использоваться.
Компилятор Dev-C++ выдает результат 9, и это логично, т. к. сперва определяется первое слагаемое 1+1, затем уже третье (1+1+1)*2
согласен! ответ 9 а не 10.
2+1+3*2 =9 , где с начала складывается 2 и 1, а потом к этой сумме прибавляется произведение 3*2
отставить) я не прав. ответ 10)))
ответ будет зависеть от компилятора, если будете такие конструкции на практике использовать вам руки отобьют
CodeBlocks выдает a=9
Чтобы в Dev++ получилось правильно, нужно писать так
int variable = 1;
int a = 0;
a = ++variable + (1 + ++variable * 2);
cout << "a = " << a << endl;
Хотя всё равно не очень понимаю, почему, ведь
++variable = 2
2+(1+ (2+1)*2)
2 + (1 + (3*2))
2 + 7 = 9
int variable = 1;
int a = 0;
a = ++variable + (1 + ++variable * 2);
cout << "a = " << a << endl;
Компилятор Microsoft Visual Studio Express 2013 дает результат 10 (притом, без скобок тот же результат). Унарная операция префиксного инкремента выполняется первой, притом дважды. variable последовательно принимает значения 2, затем – 3. Затем происходит умножение 3*2=6 и потом сложение 3+1+6=10. Такие конструкции лучше не строить, но о приоритетах операций нужно помнить.
C++ Builder 10.2 Tokyo.
Classic Borland Compiler: 10 (2+1+2*2) С права налево. Сначала сложение.
Force C++ Compiler: 9 (2*3+1+2) С лева направо. С начала умножение.
C++==C11
О времена… О нравы…
Доколе же вы все будете херню писать?
Мастера … блин…