Добрый день. Я новичок в языке программирования C++ и начинаю с простейших арифметических программ. Вопрос такого типа.
Я ввожу типы перемен int
Присваиваю a = 1, b;
И выполняю простейшее вычисление: b = ++a * ++a
Вот что у меня получилось в конечном итоге при запуске программы:
a = 3
b= 9
Дело в том, что я не совсем понимаю каким образом производиться это вычисление. Ведь если a = (1+1) * 1 + 1 = 3, то каким образом программа из этих чисел получает b = 9 да и вообще в целом как производятся эти вычисления с инкрементами?
Неравнодушных людей прошу помочь.
Другие языки программирования и технологии
Вопрос про математические процессы инкрементов и декрементов с префиксами и постфиксами. C++
Насколько я понимаю тут Undefined Behavior(неопределенное поведение). То есть компилятор может себя повести как угодно. Если между двумя точками следования одна и та же переменная меняется два и более раз, то это неопределенное поведение. То есть далеко не факт что компилятор правильно посчитает. Точки следования в данном случае это от начала выражения и до точки с запятой в конце.
a = ++a; // тоже неопределенное поведение.
В данном случае компилятор посчитал верно, но не стоит забывать что это не приемлемо так как другой компилятор может и не посчитать правильно такое выражение и это норма! Не норма так писать!
Как все же вычисляются такие выражения. Есть таблица приоритетов операций с++. Там смотрится приоритет операции и чем выше, тем раньше она выполнится и смотрится асоциативность, если приоритеты у операций одинаковые то выполняется левее или правее в зависимости от асоциативности.
ru.cppreference.com/w/cpp/language/operator_precedence
прединкремент имеет более высший приоритет и поэтому он выполнится раньше. Таким образом переменная "a" будет увеличена на один дважды, а потом результирующий вариант перемножится сам на себя. То есть 3*3 = 9. Но еще раз повторюсь что так писать нельзя!
ru.wikipedia.org/wiki/%D0%9D%D0%B5%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%91%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5
a = ++a; // тоже неопределенное поведение.
В данном случае компилятор посчитал верно, но не стоит забывать что это не приемлемо так как другой компилятор может и не посчитать правильно такое выражение и это норма! Не норма так писать!
Как все же вычисляются такие выражения. Есть таблица приоритетов операций с++. Там смотрится приоритет операции и чем выше, тем раньше она выполнится и смотрится асоциативность, если приоритеты у операций одинаковые то выполняется левее или правее в зависимости от асоциативности.
ru.cppreference.com/w/cpp/language/operator_precedence
прединкремент имеет более высший приоритет и поэтому он выполнится раньше. Таким образом переменная "a" будет увеличена на один дважды, а потом результирующий вариант перемножится сам на себя. То есть 3*3 = 9. Но еще раз повторюсь что так писать нельзя!
ru.wikipedia.org/wiki/%D0%9D%D0%B5%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%91%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5
Да бессмысленно.... ИБО!
Никогда не нужно полагаться на компилятор - разные версии по разному трактуют инкременирование.
а= 1, а++ +а++ может трактоваться и как (а+1) + (а+1), и как (а+1) + (а+1+1)
Для С++ это особо актуально.
Не так уж сложно СМЫСЛ своих расчетов излагать с помощью скобок.
Никогда не нужно полагаться на компилятор - разные версии по разному трактуют инкременирование.
а= 1, а++ +а++ может трактоваться и как (а+1) + (а+1), и как (а+1) + (а+1+1)
Для С++ это особо актуально.
Не так уж сложно СМЫСЛ своих расчетов излагать с помощью скобок.
Дониёрбек Жамолов
скобки с инкрементами то ещё развлечение :)
ну логично же
сначала инкрементировали a, два раза
а потом использовали а в вычислени
сначала инкрементировали a, два раза
а потом использовали а в вычислени
Сергей Кощеев
А здесь случайно не Undefined Behavior?
Похожие вопросы
- Инкремент и декремент
- Вопрос связан с олимпиадой по информатике! (Нужные знания языков pascal или c++)
- как узнать PID системного процесса зная его имя EXE ...необходимо реализовать на C++ VS
- C#. ++x или x++ В чем разница при записи инкремента этими двумя способами?
- C++. Как работает постфиксный инкремент?
- Авто инкремент в mySQL ?
- Для чего в колледже решает математические задачи на Pascal, C \ C ++ и. т. п ..
- Ещё тупой вопрос по C++ :)
- Почему до сих пор не создан математический архиватор?
- Как определить размер массива в процессе ввода? C++