В предыдущей статье мы с вами рассмотрели бинарные операторы, которые используют для арифметических операций с двумя операндами (переменными). А в цьому уроці ми навчимося застосовувати унарні оператори, для которых необходим один операнд. Называются они инкремент ( ++ ) і декремент (––). Роль этих операторов в том, чтобы изменить (увеличить или уменьшить соответственно) значение переменной на единицу, при этом значение будет перезаписано. Рассмотрим пример, в якому будемо змінювати значення змінної 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. Задавать вопросы в комментариях не запрещается.
Допоможіть розібратися в завданні:
х = у = 0;
while ( і < 10 ) х + = ++ і;
Printf (" x= %d y = %d\n", x, і);
Відповідь x = 55 у = 10
Я не розумію як x виходить 55. Прям голову зламала(((
х = 0 + 1 = 1
х = 1 + 2 = 3
х = 3 + 3 = 6
х = 6 + 4 = 10
х = 10 + 5 = 15
х = 15 + 6 = 21
х = 21 + 7 = 28
х = 28 + 8 = 36
х = 36 + 9 = 45
х = 45 + 10 = 55
pervaya cifra eto zna4enie x a vtoraya cifra eto zna4enie y, голосування і результати, ++y srazu uveli4ivaet zna4enie y na 1
х = 0 + 1 = 1
х = 1 + 2 = 3
х = 3 + 3 = 6
х = 6 + 4 = 10
х = 10 + 5 = 15
х = 15 + 6 = 21
х = 21 + 7 = 28
х = 28 + 8 = 36
х = 36 + 9 = 45
х = 45 + 10 = 55
pervaya cifra eto zna4enie x a vtoraya cifra eto zna4enie y, голосування і результати, ++y srazu uveli4ivaet zna4enie y na 1
До речі, а чому виходить число 10 , в строке 11 ?? Я використовую CodeBlock як середовище. Спочатку написав сам код, отримав 9. Потім спеціально скопіював ваш і … знову 9. Я так розумію, що в процесі розрахунку,коли обробляється другий інкремент, він далі множиться на 2, а тільки після цього складається з лівою частиною команди. може поясните, чому так ? Або так і повинно бути ? Тоді чому у вас 10? Та й voobshte, алгоритм дещо не логічним виходить…
Така послідовність обчислень?
a = variable + 1 + ++variable * 2
a = (2 + 1 + 2) * 2
а = ++ змінна + 1 + ++змінна * 2;
а =(2+1+3)*2; \\ я все правильно розумію?
тоді виходить 12))
Мені не зрозуміло! Якщо вважати правильно, то повинно вийти 7, так как – 2+1+2*2 = 7.
Але 10 вийти, якщо компілятор сприйняв значення (2+1+2) як в дужках, а чому він так сприйняв не зрозуміло і як писати, що б не сприймав так!?
А ось найбільше мені не зрозуміло – чому в онлайн компіляторі взагалі виходить 9!? – я навіть не зрозумів як він так вважав! Може хтось пояснить?
Так, зараз зрозумів, що другий інкремент теж збільшується – але тоді в онлайн компілятором правильно – 9, але чому 10 – от не зрозуміло!?
Тобто, наскільки я зрозумів, компілятор спочатку обчислює variable.
1. змінна = 1 + 1, присвоєно 2.
2. змінна = 2 + 1, присвоєно 3.
Тепер обчислюється а = 3 + 1 + 3 × 2 = 10. Так?
точно не рахував по “програмування”, але як і вважав 9 має повинно вийти – так зрозумів – як і в компілятором… тут може помилка або щось на зразок того….
Перевірив в 2-х онлайн компіляторах, та же петрушка, а = 9. Але по ідеї повинно бути 10, т.к пріоритет у пре-инкремента 3 RL, а по сему спочатку variable обчислюється, а потім вже він бере участь в прикладі. І він по-любому дорівнює 3, значить приклад повинен виглядати так: а = 3 + 1 + 3 * 2. компілятори ж , мабуть, вважають послідовно, т.е. а = 2 + 1 + 3 * 2, тоді дійсно виходить 9. Але чому так?! Я щось не допонял? джерело, хто б пояснив подоходчівей.
2+1+2*2
другий variable все ще зберігає значення 1, в той момент коли перший variable вже 2. але ось арифметика мені поки незрозуміла. множення то повинно виконуватися першим.