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;
}
答案 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
等于5
且f
等于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;作为最高价值。