Пространства имён
Варианты
Действия

Order of evaluation

Материал из cppreference.com
< cpp‎ | language

 
 
Язык С++
Общие темы
Управление программой
Операторы условного выполнения
Операторы повторения
Операторы перехода
Функции
объявление функции
объявление лямбда-функции
шаблон функции
спецификатор inline
спецификаторы исключений (устарело)
спецификатор noexcept (C++11)
Исключения
Пространства имён
объявление пространства имён
псевдонимы пространства имён
Типы
спецификатор decltype (C++11)
Спецификаторы
cv-спецификаторы
спецификаторы продолжительности хранения
спецификатор constexpr (C++11)
спецификатор auto (C++11)
спецификатор alignas (C++11)
Инициализация
Литералы
Выражения
Утилиты
Типы
typedef-объявление
объявление псевдонима типа (C++11)
атрибуты (C++11)
Приведения типов
неявные преобразования
const_cast-преобразование
static_cast-преобразование
dynamic_cast-преобразование
reinterpret_cast-преобразование
C-подобное и функциональное приведение типов
Выделение памяти
Классы
Особые свойства классовых функций
Специальные функции-члены
Шаблоны
шаблон класса
шаблон функции
специализация шаблона
упакованные параметры (C++11)
Разное
Ассемблерные вставки
 
Порядок вычисления операндов любой C + + оператор, в том числе порядок вычисления аргументов функции в функцию вызова выражения, а также порядок оценки подвыражений в любое выражение не определено (за исключением случаев, указанных ниже). Компилятор будет оценивать их в любом порядке, и, возможно, выбрать другой порядок, когда же выражение вычисляется снова.
Оригинал:
Order of evaluation of the operands of any C++ operator, including the order of evaluation of function arguments in a function-call expression, and the order of evaluation of the subexpressions within any expression is unspecified (except where noted below). The compiler will evaluate them in any order, and may choose another order when the same expression is evaluated again.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
Существует нет понятия слева-направо или справа-налево оценки в C + +, который не следует путать с слева-направо и справа-налево ассоциативность операторов: выражение a + b + c анализируется как (a + b) + c связи налево-направо ассоциативность оператора +, но подвыражение c может быть оценена первый (или последний, или в то же время, как a или b) во время выполнения.
Оригинал:
There is no concept of left-to-right or right-to-left evaluation in C++, which is not to be confused with left-to-right and right-to-left associativity of operators: the expression a + b + c is parsed as (a + b) + c due to left-to-right associativity of operator+, but the subexpression c may be evaluated first (or last, or at the same time as a or b) at run time.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

Содержание

[править] Поэтапный-до rulesNJ

[править] Определения

[править] Оценки

Есть два вида оценок выполняется компилятором для каждого выражения или подвыражения (оба из которых являются необязательными):
Оригинал:
There are two kinds of evaluations performed by the compiler for each expression or subexpression (both of which are optional):
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • ' Вычисления значения: расчет значения, возвращаемого выражением. Это может включать определение идентичности объекта (glvalue оценки, например, если выражение возвращает ссылку на некоторый объект) или чтение значения, присвоенные объекту (prvalue оценки, например, если выражение возвращает число, или любое другое значение )
    Оригинал:
    value computation: calculation of the value that is returned by the expression. This may involve determination of the identity of the object (glvalue evaluation, e.g. if the expression returns a reference to some object) or reading the value previously assigned to an object (prvalue evaluation, e.g. if the expression returns a number, or some other value)
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • ' Побочный эффект: доступ (чтение или запись) для объекта, указанного летучих glvalue, изменение (запись) на объект, называя библиотека ввода / вывода функции или вызова функции, что делает любая из этих операций.
    Оригинал:
    side effect: access (read or write) to an object designated by a volatile glvalue, modification (writing) to an object, calling a library I/O function, or calling a function that does any of those operations.
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

[править] Заказ

"Последовательный-до» является асимметричным, транзитивным парных отношений между оценками в том же потоке (она может распространяться на темы, если атомарные типы связаны с подходящими std::memory_order).
Оригинал:
"sequenced-before" is an asymmetric, transitive, pair-wise relationship between evaluations within the same thread (it may extend across threads if atomic types are involved with suitable std::memory_order).
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • Если секвенируют до B, то оценка будет завершена до оценки B начинается.
    Оригинал:
    If A is sequenced before B, then evaluation of A will be complete before evaluation of B begins.
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • Если не последовательно до B и B секвенируют до, то оценка B будет завершена до оценки начинается.
    Оригинал:
    If A is not sequenced before B and B is sequenced before A, then evaluation of B will be complete before evaluation of A begins.
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • Если не последовательно до B и B не последовательно, прежде чем, то две возможности:
    Оригинал:
    If A is not sequenced before B and B is not sequenced before A, then two possibilities exist:
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • * Оценки А и В непоследовательными: они могут быть выполнены в любом порядке и могут перекрывать друг друга (в пределах одного потока исполнения, компилятор может чередовать инструкции процессора, которые содержат А и В)
    Оригинал:
    * evaluations of A and B are unsequenced: they may be performed in any order and may overlap (within a single thread of execution, the compiler may interleave the CPU instructions that comprise A and B)
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • * Оценки А и В indeterminably-последовательность: они могут быть выполнены в любом порядке, но не могут пересекаться: либо будет завершена до B, или B будет завершена до A. порядок может быть противоположным в следующий раз то же самое Выражение вычисляется.
    Оригинал:
    * evaluations of A and B are indeterminably-sequenced: they may be performed in any order but may not overlap: either A will be complete before B, or B will be complete before A. The order may be the opposite the next time the same expression is evaluated.
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

[править] Правила

1)
Каждый расчет стоимости и побочный эффект полного выражения (выражение, которое не является частью другого выражения, как правило, один, который заканчивается точкой с запятой) секвенируют перед каждым вычислением стоимости и побочных эффектов следующего полного выражения.
Оригинал:
Each value computation and side effect of a full expression (an expression that is not part of another expression, typically one that ends with a semicolon) is sequenced before each value computation and side effect of the next full expression.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
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).
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
3)
При вызове функции (или не функция является встроенной, и будет ли явный синтаксис вызова функции используется), каждое значение вычислений и побочный эффект, связанный с любым аргументом выражение, или с выражением постфиксной назначения называемой функцией, последовательно до выполнения каждого выражения или заявления в теле вызываемой функции.
Оригинал:
When calling a function (whether or not the function is inline, and whether or not explicit function call syntax is used), every value computation and side effect associated with any argument expression, or with the postfix expression designating the called function, is sequenced before execution of every expression or statement in the body of the called function.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
4)
Значение вычисления встроенных постинкремента и Постфиксный декремент операторов последовательно до его побочный эффект.
Оригинал:
The value computation of the built-in postincrement and postdecrement operators is sequenced before its side-effect.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
5)
Побочный эффект встроенного в прединкремента и predecrement операторов последовательно, прежде чем его значение вычисления (неявное правило, в связи с определением в качестве составного присваивания)
Оригинал:
The side effect of the built-in preincrement and predecrement operators is sequenced before its value computation (implicit rule due to definition as compound assignment)
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
6)
Каждая величина эффекта вычислений и части первой (левой) аргумент встроенный логический оператор && и встроенный логический оператор ИЛИ
Оригинал:
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
7)
Каждый расчет стоимости и побочный эффект, связанный с первым выражением в логическом? Оператор последовательно перед каждым вычислением стоимости и побочный эффект, связанный со второго или третьего выражения.
Оригинал:
Every value computation and side effect associated with the first expression in the logical :? operator is sequenced before every value computation and side effect associated with the second or third expression.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
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)
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
9)
Каждый расчет стоимости и побочный эффект первой (левой) аргумент встроенный оператор запятая перед каждой последовательности вычисления стоимости и побочных эффектов второй (правой) аргумент.
Оригинал:
Every value computation and side effect of the first (left) argument of the built-in comma operator is sequenced before every value computation and side effect of the second (right) argument.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
10)
В Список инициализации, каждая величина эффекта вычислений и стороны данного пункта инициализатор секвенируют перед каждым вычислением стоимости и побочных эффектов, связанных с любым инициализатор пункт, который следует за ним в разделенный запятыми список из списка инициализации.
Оригинал:
In Список инициализации, every value computation and side effect of a given initializer clause is sequenced before every value computation and side effect associated with any initializer clause that follows it in the comma-separated list of the initializer list.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
11)
Вызов функции, которые не последовательно, до или последовательно за другой вызов функции неопределенно последовательности (программа должна вести себя as if инструкции процессора, которые представляют собой различные вызовы функции были не чередуются, даже если эти функции были встроены)
Оригинал:
A function call that is not sequenced before or sequenced after another function call is indeterminately sequenced (the program must behave as if the CPU instructions that constitute different function calls were not interleaved, even if the functions were inlined)
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
12)
Призыв к распределению функций (оператор нового) будет неопределенно последовательности по отношению к оценке аргументов конструктора в новом выражении
Оригинал:
The call to the allocation function (operator new) is indeterminately sequenced with respect to the evaluation of the constructor arguments in a new-expression
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

[править] Неопределенное поведение

1)
Если побочный эффект на скалярный объект непоследовательными по отношению к другим побочным эффектом того же объекта скаляр, поведение не определено.
Оригинал:
If a side effect on a scalar object is unsequenced relative to another side effect on the same scalar object, the behavior is undefined.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

i = ++i + i++; // undefined behavior
i = i++ + 1; // undefined behavior (but i = ++i + 1; is well-defined)
f(++i, ++i); // undefined behavior
f(i = -1, i = -1); // undefined behavior

2)
Если побочный эффект на скалярный объект непоследовательными по отношению к значению вычисления с использованием значения одного и того же объекта скаляр, поведение не определено.
Оригинал:
If a side effect on a scalar object is unsequenced relative to a value computation using the value of the same scalar object, the behavior is undefined.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

cout << i << i++; // undefined behavior
a[i] = i++; // undefined bevahior

[править] RulesNJ последовательности точку

[править] Определения

Оценка выражение может вызывать побочные эффекты, а именно: доступ к объекту назначенный летучих именующее, изменения объекта, называя библиотека ввода / вывода функции или вызова функции, что делает любая из этих операций.
Оригинал:
Evaluation of an expression might produce side effects, which are: accessing an object designated by a volatile lvalue, modifying an object, calling a library I/O function, or calling a function that does any of those operations.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
Точка' последовательности является точкой в ​​последовательности выполнения, где все побочные эффекты от предыдущих оценок в последовательности являются полными, и никаких побочных эффектов последующих оценок началось.
Оригинал:
A sequence point is a point in the execution sequence where all side effects from the previous evaluations in the sequence are complete, and no side effects of the subsequent evaluations started.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

[править] Правила

1)
Существует последовательность точки в конце каждого полного выражения (как правило, на точку с запятой)
Оригинал:
There is a sequence point at the end of each full expression (typically, at the semicolon)
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
2)
При вызове функции (или не функция является встроенной и действительно ли синтаксис вызова функции была использована), существует последовательность момент после оценки всех аргументов функции (если таковые имеются), которое имеет место до выполнения любого выражения или заявления в тело функции
Оригинал:
When calling a function (whether or not the function is inline and whether or not function call syntax was used), there is a sequence point after the evaluation of all function arguments (if any) which takes place before execution of any expressions or statements in the function body
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
3)
Существует последовательность момент после копирования возвращаемого значения функции и до выполнения любого выражения вне функции.
Оригинал:
There is a sequence point after the copying of a returned value of a function and before the execution of any expressions outside the function.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
4)
После выполнения функции начинается, нет выражения из вызывающей функции оценивается до выполнения называется функция завершена (функции не могут чередоваться)
Оригинал:
Once the execution of a function begins, no expressions from the calling function are evaluated until execution of the called function has completed (functions cannot be interleaved)
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
5)
При оценке каждого из следующих четырех выражений, с помощью встроенной (не перегруженный) операторов, существует последовательность точки после вычисления выражения a.
Оригинал:
In the evaluation of each of the following four expressions, using the built-in (non-overloaded) operators, there is a sequence point after the evaluation of the expression a.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

a && b
a || b
a ? b : c
a , b

[править] Неопределенное поведение

1)
Между предыдущей и следующей последовательности точки скалярного объекта должно иметь свое сохраненное значение изменение не чаще одного раза в оценке выражения.
Оригинал:
Between the previous and next sequence point a scalar object shall have its stored value modified at most once by the evaluation of an expression.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

i = ++i + i++; // undefined behavior
i = i++ + 1; // undefined behavior
i = ++i + 1; // undefined behavior (well-defined in C++11)
++ ++i; // undefined behavior (well-defined in C++11)
f(++i, ++i); // undefined behavior
f(i = -1, i = -1); // undefined behavior

2)
Между предыдущей и следующей последовательности точку, до значения скалярного объекта, который изменяется по оценке выражения, должны быть доступны только для определения значения будут храниться.
Оригинал:
Between the previous and next sequence point , the prior value of a scalar object that is modified by the evaluation of the expression, shall be accessed only to determine the value to be stored.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

cout << i << i++; // undefined behavior
a[i] = i++; // undefined bevahior

[править] См. также

  • Приоритет операторов который определяет, как выражения строятся из их представление исходного кода.
    Оригинал:
    Приоритет операторов which defines how expressions are built from their source code representation.
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • Порядок оценки на языке программирования C.
    Оригинал:
    Порядок оценки in the C programming language.
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.