我只是在玩这个非常简单的代码
int main()
{
static int Z=500;
printf("\n Value of Z is:%d",Z);
incrementZ(Z);
printf("\n Value of Z is:%d",Z);
incrementZ(Z);
printf("\n Value of Z is:%d",Z);
}
void incrementZ(static int number)
{
number++;
}
为什么静态变量不会在这里增加?
答案 0 :(得分:2)
您在Windows上,请检查this link。
根据文档,static
将替换为任何可用的标准存储类。有三种可能的情况,
它将允许编译,只产生一个警告[C4042]说类似
C4042:标识符..存储类错误
但是,只是要添加,在linux gcc上,这将无法编译。它会抛出一个错误
错误:存储类说明符在参数声明中无效
答案 1 :(得分:1)
你没有传递Z
,你传递了它的价值。变量Z
是维持其范围,即它在incrementZ
内不可用,所以没有任何反应。
您当然可以通常的方式执行此操作,即通过&Z
。
此外,函数参数上的static
不应该编译,这是无效的C.
答案 2 :(得分:1)
静态变量不应该是函数的参数。
Z
是一个静态变量。所以你应该看Z
的范围。
如果函数参数中有静态存储类,则应该看到编译器抛出错误。
答案 3 :(得分:1)
这个程序甚至不会在Linux
上编译。它会抛出以下错误
错误:为参数'number'指定的存储类
静态变量存储在数据段中,而函数参数则在堆栈上传递。
在这种情况下,Windows不会抛出错误。
答案 4 :(得分:0)
您只是传递Z中的值而不是其地址。函数的参数也是函数的成员。因此,int数的范围仅限于其功能。请尝试以下代码以获得所需的结果。
int main()
{
static int Z=500;
printf("\n Value of Z is:%d",Z);
incrementZ(&Z);
printf("\n Value of Z is:%d",Z);
incrementZ(&Z);
printf("\n Value of Z is:%d",Z);
}
void incrementZ(int *number)
{
*number=*number+1
}
int * number是一个指针,incrementZ(& Z)表示您将Z的地址传递给number。 *是取消引用运算符,用于访问数字指向的值。