В предыдущей статье мы с вами рассмотрели бинарные операторы, которые используют для арифметических операций с двумя операндами (переменными). А в цьому уроці ми навчимося застосовувати унарні оператори, для которых необходим один операнд. Называются они инкремент ( ++ ) і декремент (––). Роль этих операторов в том, чтобы изменить (увеличить или уменьшить соответственно) значение переменной на единицу, при этом значение будет перезаписано. Рассмотрим пример, в якому будемо змінювати значення змінної 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 в наш приклад, а далі все йде за математичними законами.
К примеру: [код]
int variable = 1;
int a = 0;
а = змінна ++ + ++variable + ++variable + ++variable;
cout << "a = " << a < 5+5+5+5= 20
Вирази типу показаного – це дурниця:
[код]
а = змінна ++ + ++variable + ++variable + ++variable;
[/код]
[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 Токіо.
Класичний Borland Compiler: 10 (2+1+2*2) Справа наліво. спочатку складання.
Force C ++ Compiler: 9 (2*3+1+2) З ліва прямий. З початку множення.
C ++ == C11
Про час… Про звичаї…
Доки ж ви все будете херню писати?
майстри … млинець…