变量的评估

Evaluation of variable

变量求值是什么意思?

int main(){
   int variable;
   variable;
}

“变量”有什么作用?为什么“变量”的评估应该产生自己的价值?

评估基本上意味着“执行代码”。

在表达式中,variable 将包含该变量值的 int“加载”到 CPU。

评估语句 variable; 将该值“加载”到 CPU,然后它什么都不做。 (编译器足够聪明,可以检测到没有任何反应,并且会忽略它。如果你幸运的话,它还会产生一个警告,让你知道这没有任何作用,这是可疑的。)

评估语句 int a = variable; 将该值“加载”到 CPU,然后将其分配给名为 a.

的新局部变量

在 C++ 中,与其他语言一样,表达式求值,通常return 是一个奇异值。这是通过遵循 operator precedence rules 以正确的顺序应用运算符来实现的。1

最简单的情况:

int x = 2;
int y = x + x * x;

其中表达式的 right-hand-side(相对于 = 赋值运算符)在每种情况下都需要求值。第一个语句很简单,就是 2。在第二个中,评估顺序规则适用,你得到 2 + 46.

求值是按正确顺序应用每个运算符的过程,它将产生奇异值,即该表达式的结果。

将评估视为类似于确定数学公式结果时的评估方式。规则不同,但原则相同。


1 计算参数的顺序可能不一定是它们定义的顺序。

“计算一个表达式”意味着计算它的结果并执行它的副作用。

表达式variable没有副作用。 (不像 x = 1printf("abc") 这样的东西)。

它的结果类型为 int(确定类型不是评估的一部分,因为它从不需要运行时计算),并且结果有一些任意值(实际上读取该值会导致未定义的行为,因为变量未初始化)。这个结果还有一个地址,就是variable的地址(你可以对这个表达式应用&得到那个地址)

简而言之,variable;什么都不做。


cppreference

Evaluation of each expression includes:

  • value computations: 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)
  • Initiation of side effects: 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.