Декрементация / Инкремент — это базовая операция, но она имеет приоритет над - --
а также + ++
смутил меня Я буду использовать декремент для иллюстрации:
У меня есть набор различных стилей работы между a
а также b
: Посмотрите, как это работает здесь
#include <iostream>
using namespace std;
int a=10, b=7;
int main() {
// - and -- opearator // Results: Details:
a = 10, b = 7; cout << a---b << endl; // 3 a post-decrement
a = 10, b = 7; cout << a ---b << endl; // 3 a post-decrement
a = 10, b = 7; cout << a- --b << endl; // 4 b pre-decrement
a = 10, b = 7; cout << a-- -b << endl; // 3 a post-decrement
a = 10, b = 7; cout << a--- b << endl; // 3 a post-decrement
return 0;
}
Я понимаю что 4
выход пришел от уменьшенного b
который 7
что превратилось в 6
и вычитается из a
который 10
,
Кроме того, из-за других четырех операторов я думал, что компилятор рассматривает все из них как ---
но вот, здесь прибывает путаница - --
Результаты. Посмотрите, как это работает здесь
Разбор следует за правило максимального жаворонка, поэтому все заявления минус третье интерпретируются как (a--)-b
который уменьшает a
и возвращает свое предыдущее значение (которое было 10
).
Третий a-(--b)
который является предварительным декретом о b
, так что возвращается новое уменьшенное значение.
Я думаю, что это из-за Максимальное правило Мунка. Из вики:
В компьютерном программировании и информатике, «максимальный мунк» или
«самое длинное совпадение» — это принцип, что при создании какой-либо конструкции, как
большая часть доступного ввода по возможности должна быть израсходована.
От Эксперт C Программирование:
Стандарт ANSI определяет соглашение, которое стало известно как
максимальная жаворонковая стратегия. Максимальный жук говорит, что если есть еще
чем одна возможность для следующего токена, компилятор предпочтет
откусить тот, который включает самую длинную последовательность символов.
Но почему это не уменьшилось после его заявления?
Поскольку --X
оператор:
Таким образом, нет никакого способа, которым --b
будет «уменьшаться потом». Он всегда делает это «до».
неразбериха
Посмотрите внимательно на код и результаты: каждый раз, когда ---
написано без пробелов, результат тот же: три. Три также результат -- -
дело. Даже с чистым предположением, вы могли бы сказать, что компилятор анализирует его как -- -
, На самом деле, это действительно так, потому что стандарт C ++ требует этого. Смотрите комментарии о правиле «максимального жаворонка». То же самое следует для других многосимвольных операторов, таких как ++
,
В другом случае, когда вы разделили это на - --
у компилятора не было другого выбора: он должен был трактовать это буквально как - --
из-за места посередине. Как только -- -
, этот случай очевиден, и это прекрасно видно, какая часть формирует --
оператор и компилятор должны подчиняться этому.
Это утверждение эквивалентно 10-6 = 4,
остальные эквивалентны 9-7 = 3.
#include <iostream>
using namespace std;
int a=10, b=7;
int main() {
// - and -- opearator // Results: Details after a statement:
cout << (a--)-b << endl; a=10, b=7; // 3 Both a and b decremented
cout << (a --)-b << endl; a=10, b=7; // 3 Both a and b decremented
cout << a- (--b) << endl; a=10, b=7; // 4 Neither a or b decremented
cout << (a--) -b << endl; a=10, b=7; // 3 Both a and b decremented
cout << (a--)- b << endl; a=10, b=7; // 3 Both a and b decremented
return 0;
}
В этой серии заявлений
cout << a---b << endl; a=10, b=7; // 3 Both a and b decremented
cout << a ---b << endl; a=10, b=7; // 3 Both a and b decremented
cout << a- --b << endl; a=10, b=7; // 4 Neither a or b decremented
cout << a-- -b << endl; a=10, b=7; // 3 Both a and b decremented
cout << a--- b << endl; a=10, b=7; // 3 Both a and b decremented
Вы забыли включить еще одно утверждение 🙂
cout << a --- b << endl; a=10, b=7; // 3 Both a and b decremented
Во всех этих заявлениях
cout << a---b << endl; a=10, b=7; // 3 Both a and b decremented
cout << a ---b << endl; a=10, b=7; // 3 Both a and b decremented
cout << a--- b << endl; a=10, b=7; // 3 Both a and b decremented
cout << a --- b << endl; a=10, b=7; // 3 Both a and b decremented
Компилятор анализирует выраженное выражение как
a-- -b
то есть он пытается извлечь самый длинный действительный токен.
Значение оператора postdecrement как, например, a--
значение его операнда перед уменьшением. Так в выражении
a-- -b
значение a--
10 и значение b
является 7
, Разница равна 3
,
И у вас есть единственное выражение с оператором предопределения
cout << a- --b << endl; a=10, b=7; // 4 Neither a or b decremented
Там значение --b
это значение b
после уменьшения это 6
, Так что у тебя есть 10 - 6
это равно 4
,
Если вы замените минус на плюс во всех этих утверждениях, вы получите тот же эффект
17
17
18
17
17
17 // this corresponds to my added statement a +++ b
Таким образом, эти операции — и + ++ ведут себя по сути одинаково.