静态局部变量与全局变量问题

#include "stdio.h"
#include "math.h"
#include "string.h"
int a=4;
int f(int n)
{
int t=0;static int a=5;
if(n%2)
{
int a=6;t+=a++;}
else
{
int a=7;t+=a++;}
return t+a++;
}
main()
{int s=a,i=0;
for(;i<2;i++)
s+=f(i);
printf("%d\n",s);}
为什么在f()最后一个return里a采用的是全局变量 而不是在f()定义的a.

从生存周期看,所有静态和外部变量都是全局变量。
从可见性看,外部变量是命名冲突可见性全程序可见,引用可见性自引用说明和定义以下可见。
说明以下,同名变量(标识符)第二次定义称为命名冲突,外部变量是真正的全局变量。

整个程序不可有同名变量和函数。对于命名冲突外部变量是全程序可见。

引用可见性,指的是程序可以使用该变量(变量已经在某处定义,此处可以使用)。

函数外部的静态变量是文件可见的。其他文件不可以通过名字使用该变量。
其他文件里同名的,本文件不可见的变量不和该变量产生命名冲突。
其他文件里同名的静态变量是另外一个变量。

同一文件内的同名的函数外部的静态变量和外部变量(包括本文件定义的和引用的外部变量)产生命名冲突。
函数内部的静态变量具有函数作用域,会隐藏同名的外部和文件静态变量(和函数名)。

其中函数内部,语句组内定义的静态变量,具有语句组作用域,会隐藏本语句组外面定义的所有同名标识符。
函数内部的静态变量,函数外部的静态变量,外部变量,具有全局的生存期。

静态变量以外的局部变量具有函数作用域会隐藏同名的外部和文件静态变量(和函数名)。
其中语句组内定义的局部变量,具有语句组作用域,会隐藏本语句组外面定义的所有同名标识符。

同一作用域的同名标识符(主要是函数和变量)会产生命名冲突!!
C中一切不造成隐藏的,同名标识符,会产生命名冲突,编译不能通过!!
C++由于函数可以重载,有二义性的函数命名冲突,编译不能通过!!
函数和变量的命名冲突,编译不能通过!!

函数参数 具有函数作用域。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-03-13
静态局部变量通常放在函数内部,只能在函数内部,只进行一次初始化,每次执行函数时保持上一次执行时的值,如下代码所示:
void func() {
static int x = 0; // 在对func的三次调用中,x只进行一次初始化
printf("%d\n", x); // 输出x的值
x = x + 1;
}

int main(int argc, char * const argv[]) {
func(); // 输出0
func(); // 输出1
func(); // 输出2
return 0;
}
静态全局变量是在全局变量前加一个static,使该变量只在这个源文件中可用,称之为全局静态变量,全局静态变量就是静态全局变量。
在多文件组成的程序里,全局变量与全局静态变量是不同的。全局静态变量使得该变量成为定义该变量的源文件所独享,使它文件不能使用。
第2个回答  2016-01-12
局部变量与全局变量问题。
1、局部变量是当前子程序中使用的变量,变量改变不影响除当前子程序外的程序,只能让当前子程序使用。
2、全局变量是指改变量能够被当前程序所有子程序使用的变量。
第3个回答  2013-03-12
就算它不是静态变量,return的值也是它,这就要看局部变量的作用域了。
相似回答