Точка следования
Точка следования — любая точка программы в процедурном программировании, в которой гарантируется, что все побочные эффекты предыдущих вычислений уже проявились, а побочные эффекты последующих еще отсутствуют. Их часто упоминают, говоря о языках C и C++, поскольку результат некоторых выражений может зависеть от порядка вычислений. Добавление одной или нескольких точек следования задает порядок более жестко и является одним из методов достижения повторяющегося результата.
Рассмотрим две функции f() и g(). По стандарту языка C и C++ оператор сложения + не является точкой следования, поэтому в выражении g()+f() возможно, что любая из функций может быть вычислена первой. Оператор , явлется точкой следования, и потому для выражения f(),g() функции будут вычислены в том порядке, в котором определены: сначала f(), затем g(). Тип и значение всего выражения определяются в данном случае функцией g(), значение же f() будет утеряно.
Точки следования также необходимы в ситуации, когда одна и та же переменная изменяется более 1 раз. Часто в качестве примера приводят выражение i=i++, в котором происходит присвоение и инкремент одной и той же переменной; какое значение примет i? Стандарт языка должен либо указать одно из возможный поведений программы как единственное допустимое, либо указать диапазон допустимых поведений (см. неуточняемое поведение), либо указать, что поведение программы в данном случае совершенно не определено (см. неопределённое поведение).
В C и C++ определены точки следования:
- Между левым и правым операндами в логическом И, логическом ИЛИ и запятыми. Например, в выражении
*p++ != 0 && *q++ != 0все побочные эффекты левого операнда*p++ != 0проявятся до начала каких либо действий в правом. - Между первым и вторым или третьим операндом в операторе условия. В строке
a = (*p++) ? (*p++) : 0точка находится после первого операнда*p++, при выполнении второго p уже увеличена на 1 - В конце всего выражения(в С++ обозначается символом
;) Эта категория включает в себя присвоениеa=b;, возврат значения, операторы ветвления и циклаif,switch,whileилиdo-while,for - При вызове функции перед выполнением ее кода. Порядок, в котором вычисляются аргументы не определен, но эта точка следования как средство, что все ее побочные эффекты проявились перед входом в функцию. Для фрагмента кода
f(i++) + g(j++) + h(k++)функцияfполучает в качестве параметра исходное значениеi, ноiувеличивается до начала выполнения кода внутриf. Аналогичноjиkпринимают новое значение перед выполнениемgandhсоответственно. Однако, порядок функцийf(),g(),h()не определен, так же как и порядок инкрементаi,j,k. Значенияjиkв теле функцииfоказываются неопределенными. Следует заметить, для функции от нескольких переменныхf(a,b,c), разделенных запятой, не определен порядок вычисления значения этих переменных. - При возврате из функции, когда возвращаемое значение скопировано в контекст.(Явно описана только в стандарте С++, в отличие от С)
- В конце присвоения переменных, например
int a = 5;.
(В C++ перегруженные операторы выступают в роли функций, поэтому точкой следования является вызов перегруженного оператора)
См. также
Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....