В предыдущей статье мы с вами рассмотрели бинарные операторы, которые используют для арифметических операций с двумя операндами (переменными). А в этом уроке мы научимся применять унарные операторы, для которых необходим один операнд. Называются они инкремент ( ++ ) и декремент (––). Роль этих операторов в том, чтобы изменить (увеличить или уменьшить соответственно) значение переменной на единицу, при этом значение будет перезаписано. Рассмотрим пример, в котором будем изменять значение переменной 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. Задавать вопросы в комментариях не запрещается.
в последнем примере всё просто:
a = ++variable + 1 + ++variable * 2;
разобьем на простые задачи:
int variable = 1; variable равен единице, значит:
а = (1++ равно 2) +1 + (1++ равно 2) *2;
а = 2 + 1 + 2 * 2;
а = 5 *2; отсюда = 10!!!
Правильный ответ у Вас вышел случайно ))) Скажите, сколько будет 2 + 2 * 2 ? ))
З.Ы. Сначала выполняются ВСЕ префиксные операции ;)
да точно! ошибка)
у умножения приоритет выше! + инкремент и декремент меняют значение переменной, так что variable будет равен 3…
выходит: а = 3 + 1 +3 * 2; иначе: 3 + 1 + (3*2) = 4 + 6 = 10!
спасибо автору за тему, как раз то что нужно!
всё коротко и ясно! не к чему придереться!)
да все криво и косо, согласен )
“Постфиксная форма будет применена после выполнения других команд.”
Вот смотрите сюда: http://ru.cppreference.com/w/cpp/language/operator_precedence
У постфиксного декремента приоритет выше чем у префиксного. И это правильно и соответствует стандарту. Реально все гораздо проще чем вы тут пишите , а про a++ + ++a уже лет 10 спорят школьники, которые не смотрели дальше носа. Разные древние компиляторы обрабатывают этот пример по разному.
Но ты можешь убедиться, что
std::cout << (a++) + ++a;
в g++ вернет тоже самое что и
std::cout << a++ + ++a;
потому что постфиксная операция всегда выполняется раньше.
и еще, ребят, расставляйте отступы единообразно.
Вот тут вы их начали ставить: https://purecodecpp.com/archives/588 , но в первом листинге пишите
main() {
setlocale...
}
Во втором
main() {
setlocale...
}
И дальше примерно так шпарите:
if (NumberOfFinger == 1)
cout << "\nРезультат: Большой палец \n"; // почему тут пробелов больше
else if (NumberOfFinger == 2)
cout << "\nРезультат: Указательный палец\n"; // чем здесь?
Не знаю как вам, а мне сразу режет глаз этот беспредел.
И да, сделайте что-нибудь с отображением кода в комментариях.
Тег
на работает.
Объясните почему получается 10, а не 9?
a = ++variable + 1 + ++variable * 2;
1) ++variable – сделает variable = 2
2) ++variable вторая – сделает variable = 3
3) variable * 2 значит 2*3=6
4) 3 + 1 + 6 даст 10
И все равно как то не так ведь variable изначально 1 после префиксного инкремента первая равна 2 то есть получается 2+1+3*2 быть может из за того что умножение выполняется первым код возвращается к началу и variable первая еще раз увеличивается а потом уже складываются обе части тогда 3+1+3*2 верно
Я правильно понял?
да – сначала умножение. А когда выполняется первое сложение, variable уже равна 3. Еще раз не увеличивается
Ой,да,спасибо огромное