Почему измененное значение не вступает в силу с переменной pass-by-reference во время выполнения цепочки операторов вставки [duplicate]

@classmethod: может использоваться для создания общего глобального доступа ко всем экземплярам, ​​созданным из этого класса ..... например, для обновления записи несколькими пользователями ... Я особенно нашел, что это полезно при создании синглетов ..:)

@статический метод: не имеет ничего общего с классом или экземпляром, связанным с ... но для чтения может использовать статический метод

10
задан Jerry Coffin 4 March 2013 в 18:05
поделиться

4 ответа

Порядок оценки элементов в выражении неуточнен (кроме некоторых очень частных случаев, таких как операторы && и || и тернарный оператор, которые вводят точки последовательности ); поэтому не гарантируется, что test будет оцениваться до или после foo(test) (который его модифицирует).

Если ваш код зависит от конкретного порядка оценки, самым простым методом его получения является разделение вашего выражения на несколько разделенных операторов.

21
ответ дан Matteo Italia 25 August 2018 в 09:38
поделиться

Порядок оценки неуточнен. Это не слева направо, справа налево или что-то еще.

Не делайте этого.

10
ответ дан John Dibling 25 August 2018 в 09:38
поделиться

Ответ на этот вопрос изменился в C ++ 17.

Оценка перегруженных операторов теперь упорядочена так же, как и для встроенных операторов (C ++ 17 [over.match.oper ] / 2).

Кроме того, теперь <<, >> и операторы подписи теперь имеют левый операнд , упорядоченный до справа, а постфиксное выражение вызова функции - упорядочивается до оценки аргументов.

(Другие бинарные операторы сохраняют свое предыдущее упорядочение, например + по-прежнему не подвержены последовательности).

Итак, код в вопросе должен теперь выводить Value of test is : 0 Return value of function is : 1 Value of test : 1. Но совет «Не делай этого» по-прежнему разумен, учитывая, что для обновления до C ++ 17 потребуется некоторое время.

3
ответ дан M.M 25 August 2018 в 09:38
поделиться

Порядок оценки неуточнен, см. http://en.wikipedia.org/wiki/Sequence_point

Это та же ситуация, что и пример с примером оператора + :

Рассмотрим две функции f() и g(). В C и C ++ оператор + не связан с точкой последовательности, и поэтому в выражении f()+g() возможно, что либо f(), либо g() будут выполнены в первую очередь.

2
ответ дан melpomene 25 August 2018 в 09:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: