Order of evaluation

来自cppreference.com
< cpp‎ | language

 
 
C++语言

|- class="t-nv-h1" | colspan="5" | 一般主题 |- | |- |

预处理器
注释

|

|-

|- class="t-nv-h1" | colspan="5" | 流程控制 |-

条件执行语句

| |- |

|

|-

循环语句

| |- |

|

|-

跳转语句

| |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 函数 |-

函数声明 Lambda函数声明 inline说明符 异常说明符 (已弃用) noexcept说明符 (C++11)

|- class="t-nv-h1" | colspan="5" | Exceptions |- | |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 命名空间 |- | |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 类型 |- | |- |

|

|-

说明符

| |- |

decltype (C++11)
auto (C++11)
alignas (C++11)

|

|-

存储持续期说明符 Initialization

| |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 表达式 |- | |- |

值类别
求值顺序

|

|-

替代表示 字面量 布尔型 - 整型 - 浮点型 字符型 - 字符串 - nullptr (C++11) 用户定义 (C++11)

|- class="t-nv-h1" | colspan="5" | Utilities |-

属性 (C++11) Types typedef声明 类型别名声明 (C++11) Casts 隐式类型转换 - 显示类型转换 static_cast - dynamic_cast const_cast - reinterpret_cast 内存分配

| |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 类 |- | |- |

|

|-

类特有的函数属性

| |- |

|

explicit (C++11)
static

|-

静态成员函数

| |- |

|

|- |- class="t-nv-h1" | colspan="5" | 模板 |- | |- |

|

|- |- class="t-nv-h1" | colspan="5" | 杂项 |- | |- |

|

|-

 
承评价的任何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 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

[编辑] 订购

“测序之前”是一个非对称的,传递的,对明智地在同一个线程(它可能会扩展到原子类型的线程,如果合适的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 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

[编辑] 规则

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

[编辑] 另请参阅

来自“http://zh.cppreference.com/mwiki/index.php?title=cpp/language/eval_order&oldid=31133