临时(rvalue)存储在哪里?

时间:2017-07-23 12:03:41

标签: c++

考虑以下代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long int n, i, j, max1 = -1000000000, max2 = -1000000000;
    cin >> n;
    long long int a[n];
    for (i = 0; i < n; i++)
    {
        cin >> a[i];
        if (a[i] > max1)
            max1 = a[i];
        j = i;
    }
    for (i = 0; i < n; i++)
    {
        if (a[i] > max2 && i != j)
            max2 = a[i];
    }
    cout << max1*max2;
}

假设max1=3max2=6 然后程序的最后一行输出&#39; 18 on terminal ; we have not used any variable to store the result of this multiplication operation ,then where is '18,然后在屏幕上打印出来。编译器在编译时是否创建了一个新变量来存储该值?

1 个答案:

答案 0 :(得分:0)

<<cout的运算符。运算符就像函数一样,它们接受参数。那么会发生什么呢max1*max2被计算并作为参数传递给这个人:ostream& operator<< (long long val);关于如何存储该值的详细信息在很大程度上取决于编译器如何决定优化对operator<<的特定调用对于cout,但您可以认为它在某个时刻存储在堆栈中。

那就是说,max1*max2是一个临时的(一个右值)。它取决于编译器存储临时存储的位置;标准仅指定其生命周期。通常,它将被视为自动变量,存储在寄存器或函数的堆栈框架中,但同样由编译器决定。

想想当你打电话时会发生什么:

int n=13;
int nn= sqrt(n*(n+1)*-n+5));

首先计算n*(n+1)*-n+5)的值,并将其作为参数传递给sqrt。 同样的事情发生在cout<<max1max2

VLA 不属于C++标准的一部分,即使g++clang++都通过扩展程序支持这些标准。请考虑使用容器。 More details here