Точка следования

Материал из Seo Wiki - Поисковая Оптимизация и Программирование

Перейти к: навигация, поиск

Точка следования — любая точка программы в процедурном программировании, в которой гарантируется, что все побочные эффекты предыдущих вычислений уже проявились, а побочные эффекты последующих еще отсутствуют. Их часто упоминают, говоря о языках C и C++, поскольку результат некоторых выражений может зависеть от порядка вычислений. Добавление одной или нескольких точек следования задает порядок более жестко и является одним из методов достижения повторяющегося результата.


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

Точки следования также необходимы в ситуации, когда одна и та же переменная изменяется более 1 раз. Часто в качестве примера приводят выражение i=i++, в котором происходит присвоение и инкремент одной и той же переменной; какое значение примет i? Стандарт языка должен либо указать одно из возможный поведений программы как единственное допустимое, либо указать диапазон допустимых поведений (см. неуточняемое поведение), либо указать, что поведение программы в данном случае совершенно не определено (см. неопределённое поведение).


В C и C++ определены точки следования:

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

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

См. также

Личные инструменты

Served in 0.043 secs.