Static Float变量仅存储分配的最高值;需要它来存储最近的

时间:2016-03-10 20:26:09

标签: c++

This似乎是最接近的;我的程序很相似,但我的问题略有不同。

我很难理解为什么这个程序的输出是“5,5”而不是“5,4”。我的印象是,一旦调用maxvalue函数,值“4”立即被赋值给“static float”变量“m”。

如果是这种情况,为什么5是输出而不是4?

#include <iostream>
using namespace std;

float keepmax(float f) {
    static float m = f;
    if(f>m) 
        m = f;
    return m;
}
int main() {
    cout << keepmax(5) << endl;
    cout << keepmax(4) << endl;
    return 0;
}

3 个答案:

答案 0 :(得分:1)

在C ++中,在函数作用域内声明的static变量将被创建并初始化一次,用于对该函数的所有非递归调用。

注意:根据C ++标准,对静态变量初始化的递归调用影响是未定义的行为。

C ++标准6.7第4段:

  

如果控件在初始化变量时以递归方式重新输入声明,则行为未定义。

示例:

int foo(int i) {
    static int s = foo(2*i); // recursive call - undefined
    return i+1;`
}

当您的函数第一次进入keepmax函数时,您的static float m变量将初始化为传入的值,在本例中为5。从现在开始,已经创建并初始化了变量,并且实际上将跳过static float m = f;语句。

第二次您的功能输入keepmax时,m仍然具有第一次调用的值5,并且执行(基本上)“跳过”static float m = f;声明并直接进行比较。由于m等于5f等于4,因此比较(f>m)为false(因为4不大于5 ),随后的任务永远不会发生。

答案 1 :(得分:0)

  

我的印象是价值&#34; 4&#34;立即被分配到&#34;静态浮动&#34;变量&#34; m&#34;一旦调用了maxvalue函数。

你在错误的印象中,那不是赋值而是初始化,并且它只在第一次执行流经过该代码时发生一次,这是本地静态变量如何工作的。如果您希望该变量每次都更改值,则需要将其设置为非静态:

float m = f;

或者您也可以每次都进行分配:

static float m;
m = f;

但是将此变量设为静态没有任何意义(除非有条件地完成此分配)

答案 2 :(得分:0)

因为静态将在函数返回后继续保持其值。因此,当你第二次打电话时,它仍然保留了#5;&#39; 5&#39;作为最高价值。