Order of evaluation

来自cppreference.com
< cpp‎ | language

 
 
C++语言
大会的主题
原文:
General topics
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
流量控制
原文:
Flow control
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
条件执行语句
原文:
Conditional execution statements
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
迭代语句
原文:
Iteration statements
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
跳转语句
原文:
Jump statements
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
功能
原文:
Functions
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
函数声明
lambda函数的声明
函数模板
的历史。内嵌说明
异常规范 (已弃用)
noexcept说明 (C++11)
例外
原文:
Exceptions
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
命名空间
原文:
Namespaces
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
类型
原文:
Types
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
decltype specifier (C++11)
规范
原文:
Specifiers
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
CV符
存储时间说明符
constexpr说明 (C++11)
汽车符 (C++11)
alignas说明 (C++11)
初始化
原文:
Initialization
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
原文:
Literals
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
布尔文字
nullptr (C++11)
用户定义的 (C++11)
表达式
原文:
Expressions
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
价值类型
为了评价
另一种表示形式
实用工具
原文:
Utilities
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
类型
原文:
Types
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
typedef declaration
声明类型别名 (C++11)
属性 (C++11)
施放
原文:
Casts
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
隐式转换
const_cast conversion
static_cast conversion
dynamic_cast conversion
reinterpret_cast conversion
C-风格和功能转换
内存分配
原文:
Memory allocation
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
原文:
Classes
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
类特定的功能特性
原文:
Class-specific function properties
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
虚函数
覆盖说明 (C++11)
最后说明 (C++11)
明确的 (C++11)
静态的
特殊的成员函数
原文:
Special member functions
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
模板
原文:
Templates
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
类模板
函数模板
模板特化
参数包 (C++11)
杂项
原文:
Miscellaneous
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
内联汇编
 
承评价的任何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 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
有没有概念的左 - 到 - 右或右 - 到 - 左的评价中Ç+ +,这是不以被混淆与左 - 到 - 右和右 - 到 - 左结合性的运营商:的表达a + b + c被解析为(a + b) + c由于在运行时,左到右运营商+之间的关联性进行评估,但该子表达式c第一(或最后一个,或在同一时间ab).
原文:
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,修改(写)到指定的对象,调用一个库的I / O功能,或调用一个函数,这些操作的对象的访问(读或写).
    原文:
    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 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 如果A在B之前测序,然后将评价一个完整的评价的B开始之前..
    原文:
    If A is sequenced before B, then evaluation of A will be complete before evaluation of B begins.
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 如果A前B和B的前一个测序测序,然后评估将是完整的评价A开始前的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 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 如果A没有B和B测序之前不测序A之前,则有两种可能性存在:
    原文:
    If A is not sequenced before B and B is not sequenced before A, then two possibilities exist:
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • *编序的A和B的评价:他们可能会以任何顺序进行,并可能会重叠(在一个线程中执行,编译器可能会交织的CPU指令,包括A和B)
    原文:
    * 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 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • * A和B的评价是不能决定排序:它们可能以任何顺序进行,但不能重叠:无论是A在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)
内置的后递增和postdecrement运营商的值计算测序之前,它的副作用.
原文:
The value computation of the built-in postincrement and postdecrement operators is sequenced before its side-effect.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
5)
内置的副作用预递增和递减前运营商测序前值计算(隐含规则的定义为复合赋值)
原文:
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)
每个值的第一个(左)参数的计算和副作用内置逻辑AND运算符&&和内置的逻辑OR运算符
原文:
这段文字是通过 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的CPU指令,不构成不同的函数调用交错,即使内联函数)
原文:
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)
分配函数的调用(new运算符)不定的评价的构造函数的参数在一个新的表达序列
原文:
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

[编辑] 定义

评价一个表达式可能产生的副作用,这是访问对象指定的挥发性左值,修改一个对象,调用一个库的I / O功能,或调用一个函数,这些操作.
原文:
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“序列点”是从以前的评估序列中的所有副作用是完整的,无副作用的后续评估开始执行序列中的一个点.
原文:
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 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里