Форум программистов, компьютерный форум CyberForum.ru

Order of evaluation - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Функция , которая перезапускает проект http://www.cyberforum.ru/cpp-beginners/thread1774494.html
Подскажите есть команда или ф-Ия которая перезапускает проект заного Завершает текущий проект и открывает его заного Спасибо
C++ Использование стороннего контейнера Помогите из этого кода, сделать нормальную прогу #ifndef _GLIBCXX_ARRAY #define _GLIBCXX_ARRAY 1 #pragma GCC system_header #if __cplusplus < 201103L # include <bits/c++0x_warning.h> #else http://www.cyberforum.ru/cpp-beginners/thread1774493.html
Доступ к данным при наследовании C++
здравствуйте, есть иерархия классов, схематично можно представить так: namespace Singl { class CObs {}; template<typename T> class A { public: virtual ~A() { delete variables; } static T* Instance() {
C++ Распознавание слов в аудиофайле. С чего начать?
Здравствуйте уважаемые! Передо мной встала задача написать программу которая будет брать аудиофайл(предположительно в wav) и искать в нём некие слова. С такой областью разработки я ещё не сталкивался, поэтому прошу помощи, с чего мне начать? Что прочесть? Спасибо!
C++ Найти ранг матрицы http://www.cyberforum.ru/cpp-beginners/thread1774461.html
Найти ранг прямоугольной матрицы A(m,n) методом Гаусса.Покажите пожалуйста на примере как реализовать это , заранее благодарю .
C++ Центр тяжести выпуклого многоугольника Итак народ , необходимо найти центр тяжести выпуклого многоугольника заданного своими вершинами в порядке обхода по часовой стрелке ... подробнее

Показать сообщение отдельно
ASCII
90 / 62 / 10
Регистрация: 15.12.2013
Сообщений: 399
Завершенные тесты: 2
02.07.2016, 17:00  [ТС]     Order of evaluation
Цитата Сообщение от Croessmah Посмотреть сообщение
Да, потому что не ясно становится что в каком порядке будет вычислено.
Цитата Сообщение от Croessmah Посмотреть сообщение
В i = i++ + 1, вы i меняете дважды, причем порядок изменений не определен.
Вот тут мы в плотную подошли к моменту, который меня на самом деле до сих пор путает.
Смотрите, имеем общее правило для вычисления операндов какого-либо оператора:

2) The value computations (but not the side-effects) of the operands to any operator are sequenced before the value computation of the result of the operator (but not its side-effects).

То есть просто сказано, что сначала вычисляются операнды, а только потом результат всего оператора. Все.
Далее у нас есть также и частный случай для операторов присвоения.

8) The side effect (modification of the left argument) of the built-in assignment operator and of all built-in compound assignment operators is sequenced after the value computation (but not the side effects) of both left and right arguments, and is sequenced before the value computation of the assignment expression (that is, before returning the reference to the modified object)

Тут уже говорится несколько иначе. Первым делом вычисляются значения операндов оператора присваивания, то есть объект, которому присваивается и "результирующий объект", полученный после вычисления выражения, которое присваивается.

C++
1
a = B; /* где B - любое выражение, не обязательно идентификатор переменной */
Затем, только после вычисления значений этих операндов, происходит side effect левого аргумента.
И УЖЕ ПОСЛЕ ЭТОГО, происходит финальный value computation.

То есть тут получается все упорядочено оказывается? И это сбивает с толку. Ведь если следовать этим правилам (а другие правила тут не работают вроде-бы), то по моим умозаключениям получаем такую картину:

C++
1
2
int i = 0;
i = i++ + 1;
1 Этап - вычисляем операнды.
Поехали:

Первый вариант - сначала i, потом i++ + 1
i == 0 - вычислили, i - просто идентификатор, стоящий слева, не содержит никаких подвыражений.
i++ + 1 - опять, можем считать сначала i++, потом 1, или наоборот, но в данном случае, это не важно.
i++ == 0, i становится равной 1
получаем - 1 + 1.

Второй вариант - сначала i++ + 1, потом i
получим в итоге для i++ + 1 - 1 + 1
но на стадии вычисления i получим 1, но какая разница? Если это затирается?
Ничего не поменяется ведь...
Где-то тут чувствую я ошибаюсь

ОПЕРАНДЫ ВЫЧИСЛИЛИ.


2 Этап - side effect для левого операнда
Тут ясно все, все по порядку, вычислили операнды, и начинаем изменять объект i, присваиваем результат 1 + 1

Ну и финал - возврат ссылки на i, как результата выражения.

Вот и получается, что тут будет 2

Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
Милицию в полицию тоже переименовали
Думаю, смысл высказывания ясен
Смысл то ясен
На самом деле я хотел сказать о другом, что некоторые операции, которые в соответствии с правилом sequence point были UB, могут не являться таковыми в соответствии с правилом sequence before
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru