Все логические операции (&&, ||) являются точками следования, т.е. все побочные эффекты выполняются при переходе к следующему подусловию. Поэтому операции инкремента выполнятся до проверки i
@@selfedu_rus это как раз понятно, вопрос был не в этом. Я про то, верно ли я понял, что n++, возвращает копию данных (rvalue), а уже после, до начала следующей точки следования происходит инкремент n (lvalue). Т.е. тогда утверждение из более раннего видео, где говорилось, что в операторе вида i = n++; происходит сначало присвоение i = n, а затем инкремент n, не совсем верно, т.к. согласно стандарта, точный момент инкремента n в данном случае не определен, но должен произойти до начала следующей точки следования. Т.е. инкремент n вполне может произойти и до присвоения значения i, т.к. операция присвоения не является точкой следования.
@@weerbox Не совсем понимаю тогда вопроса. В команде: i = n++; переменной i присваивается именно копия n (как иначе?), а значит, инкремент сработает точно, после присваивания, иначе копия n оказалась бы на единицу больше (инкремент на уровне машинных кодов работает с самой переменной), а это уже противоречение порядка работы постфиксной формы инкремента.
@@selfedu_rus А почему вы не рассматриваете такой вариант?: 1. n++ возвращает копию значение равное значению n (это же еще не присвоение в i, а вычисление правого операнда, ведь выражение может быть и чуть сложнее например i = n++ + 1;) 2. n инкрементится (при этом возвращенное n++ rvalue не меняется т.к. оно не ассоциировано с областью памяти на которое ссылается n) 3. i присваевается вычисленное правостороннее выражение (в котором не использовалось инкременченное значение n) А если бы было точно известно, что инкрементится только после присвоения, то тогда бы, как я понимаю, не было никакого неопределенного поведения в операторах типа: i = n++ + n++; i = n++ + n; i = i++; и т.д. Вот что написано в 99 стандарте по этому поводу: "The result of the postfix ++ operator is the value of the operand. After the result is obtained, the value of the operand is incremented. (That is, the value 1 of the appropriate type is added to it.) ... The side effect of updating the stored value of the operand shall occur between the previous and the next sequence point." А так как присвоение не является sequence point, следовательно инкремент возможен как до (т.е. на начале инструкции i = n++;), так и после присвоения (т.е. до следующей точки следования), отсюда и ub в тех примерах выше. Я так понимаю.
Сергей, Вы, просто, молодец. Уважение Вам. 👍🔥
Большое спасибо, все понятно и четко.
Утром отлично заходит👍😎
Большое спасибо! Как всегда всё объяснено подробно и доступно!
Спасибо. Все понятно.
Спасибо! Очень интересно!!!
Спасибо
Спасибо!
спасибо мегаполезно
Отличное объяснение материала !!!
спасибо!👏👍
😮
По поводу условия (++i
Погуглил, почитал 99 стандарт и пришёл к такому выводу.
В выражении (i++
Все логические операции (&&, ||) являются точками следования, т.е. все побочные эффекты выполняются при переходе к следующему подусловию. Поэтому операции инкремента выполнятся до проверки i
@@selfedu_rus это как раз понятно, вопрос был не в этом. Я про то, верно ли я понял, что n++, возвращает копию данных (rvalue), а уже после, до начала следующей точки следования происходит инкремент n (lvalue). Т.е. тогда утверждение из более раннего видео, где говорилось, что в операторе вида i = n++; происходит сначало присвоение i = n, а затем инкремент n, не совсем верно, т.к. согласно стандарта, точный момент инкремента n в данном случае не определен, но должен произойти до начала следующей точки следования. Т.е. инкремент n вполне может произойти и до присвоения значения i, т.к. операция присвоения не является точкой следования.
@@weerbox Не совсем понимаю тогда вопроса. В команде:
i = n++;
переменной i присваивается именно копия n (как иначе?), а значит, инкремент сработает точно, после присваивания, иначе копия n оказалась бы на единицу больше (инкремент на уровне машинных кодов работает с самой переменной), а это уже противоречение порядка работы постфиксной формы инкремента.
@@selfedu_rus А почему вы не рассматриваете такой вариант?:
1. n++ возвращает копию значение равное значению n (это же еще не присвоение в i, а вычисление правого операнда, ведь выражение может быть и чуть сложнее например i = n++ + 1;)
2. n инкрементится (при этом возвращенное n++ rvalue не меняется т.к. оно не ассоциировано с областью памяти на которое ссылается n)
3. i присваевается вычисленное правостороннее выражение (в котором не использовалось инкременченное значение n)
А если бы было точно известно, что инкрементится только после присвоения, то тогда бы, как я понимаю, не было никакого неопределенного поведения в операторах типа:
i = n++ + n++;
i = n++ + n;
i = i++;
и т.д.
Вот что написано в 99 стандарте по этому поводу:
"The result of the postfix ++ operator is the value of the operand. After the result is
obtained, the value of the operand is incremented. (That is, the value 1 of the appropriate
type is added to it.) ... The side effect of updating the stored value of the operand shall occur between
the previous and the next sequence point."
А так как присвоение не является sequence point, следовательно инкремент возможен как до (т.е. на начале инструкции i = n++;), так и после присвоения (т.е. до следующей точки следования), отсюда и ub в тех примерах выше. Я так понимаю.
Очень понравились ваши уроки по Flask, хотел бы узнать будут ли по Fast API?
Пока не планирую.
Здравствуйте. Почему видео 35, а показывает 23, 12 скрыто, или есть условия для их просмотра ?
Они будут постепенно выходить.
Подскажите, а cin >> из С++ тоже можно с while запихнуть как scan()?
да, можно