C语言静态变量定义时赋初值和不赋初值

C语言静态变量定义时赋初值和不赋初值,第1张

239: m=n+++n---n;

00401047 mov eax,dword ptr [ebp-4](1)

0040104A mov dword ptr [ebp-8],eax(2)

0040104D mov ecx,dword ptr [ebp-4](3)

00401050 sub ecx,1 (4)

00401053 mov dword ptr [ebp-4],ecx (5)

00401056 mov edx,dword ptr [ebp-4] (6)

00401059 add edx,1 (7)

0040105C mov dword ptr [ebp-4],edx (8)

从上面可以看出来(1)(2)是计算m=n+n-n的,(4)(5)(6)是计算n--的,(6)(7)(8)是计算n++的,这也符合++、--是从右到左的运算规则。

m=(n++)+(n--)-n;

0040102F mov eax,dword ptr [ebp-4]

00401032 mov dword ptr [ebp-8],eax

00401035 mov ecx,dword ptr [ebp-4]

00401038 sub ecx,1

0040103B mov dword ptr [ebp-4],ecx

0040103E mov edx,dword ptr [ebp-4]

00401041 add edx,1

00401044 mov dword ptr [ebp-4],edx

两者对比下就知道了,加了两个括号是等价的

符合要求!static变量只在函数内部可见,存在于程序运行的全过程

普通局部变量在函数运行结束便被释放所以,这里的static_var会每次输出不同的结果,var却每次都是0;

主要是1、2题哇???那我就开工了,直接输入的,没经过编译,自己查一下错。

第一题:

#define MAX 0

#define MIN 1

float fun(float a[],float maxmin[])

{int i;

float average,s=0;

maxmin[MAX]=maxmin[MIN]=a[0];

for(i=0;i<N;i++)

{s+=a[i];

if(a[i]>maxmin[MAX])maxmin[MAX]=a[i];

if(a[i]<=maxmin[MIN])maxmin[MIN]=a[i];

}

average=s/N;

return average;

}//返回的是平均分,主函数定义一个数组maxmin[2]存放最高分和最低分

第二题:

e好像n久前做过一次,找找

哈哈,拿分拿分!!

#include<mathh>

#include<stdioh>

float avxue(float (p)[4],int n)

{int i;

float s=0,average;

for(i=0;i<4;i++)

s+=((p+n)+i);

average=s/4;

return(average);

}

float avke(float (p)[4],int n)

{float s=0,average;

int i;

for(i=0;i<4;i++)

s+=((p+i)+n);

average=s/4;

return(average);

}

notpass(char name[],float (p)[4])

{int i,j,k,s,y=0;

float q;

printf("\n\nThe one who did not pass twice :\n");

for(i=0;i<4;i++)

{q=(p+i);s=0;

for(j=0;j<4;j++)

if(((p+i)+j)<60)s+=1;

if(s>=2)

{y=1;

printf("%-8s ",name[i]);

for(k=0;k<4;k++)

printf("%42f ",(q+k));

printf("\n");

}

}

if(y==0)printf("none!!");

}

good(char name[],float (p)[4])

{int i,j,k,s,x,y=0;

float q;

printf("\n\nThe one whose average >90 or whose all >85:\n");

for(i=0;i<4;i++)

{q=(p+i);s=0;x=0;

for(j=0;j<4;j++)

{s+=((p+i)+j);

if(((p+i)+j)>=85)x+=1; }

if((s>=360)||(x==4))

{y=1;

printf("%-8s ",name[i]);

for(k=0;k<4;k++)

printf("%42f ",(q+k));

printf("\n");

}

}

if(y==0)printf("none!!");

}

main()

{float a[4][4]={{88,92,94,72},{99,89,88,100},{68,48,57,71},{86,87,88,97}};

float (p)[4];

int i,j;

float average[4],average_k[4];

float s=0;

char kecheng[]={"Math","Chinese","English","C++","average"};

char name[]={"Smith","Billy","Bill","Tom"};

sqrt(0);

p=a;

for(i=0;i<4;i++)

{average[i]=avxue(p,i);

average_k[i]=avke(p,i);

}

printf("\t");

for(i=0;i<5;i++)

printf("%-8s",kecheng[i]);

printf("\n\n");

for(i=0;i<4;i++)

{printf("%-8s",name[i]);

for(j=0;j<4;j++)

printf("%-82f",((p+i)+j));

printf("%-52f\n",average[i]);

printf("\n\n");

}

printf("average ");

for(i=0;i<4;i++)

printf("%-82f",average_k[i]);

notpass(name,p);

good(name,p);

getch();

printf("\n\nplz change the parameters yourself!and site my answer be the best answer!thx!\npress any key to exit!");

}

static不是允许修改,你估计和const搞混了,static表示静态存储,直到整个程序结束变量值才会从存储区释放,静态变量又分为全局静态变量和局部静态变量,

全局变量与全局静态变量的区别:

(a)若程序由一个源文件构成时,全局变量与全局静态变量没有区别。

(b)若程序由多个源文件构成时,全局变量与全局静态变量不同:全局静态变量使得该变量成为定义该变量的源文件所独享,即:全局静态变量对组成该程序的其它源文件是无效的。

(c)具有外部链接的静态;可以在所有源文件里调用;除了本文件,其他文件可以通过extern的方式引用;

静态全局变量的作用:

(a)不必担心其它源文件使用相同变量名,彼此相互独立。

(b)在某源文件中定义的静态全局变量不能被其他源文件使用或修改。

(c) 只能在本文件中使用!具有内部链接的静态;不允许在其他文件里调用;

静态局部变量和作用域和局部变量一样,不过生存周期不一样,局部变量在定义局部变量的函数调用完之后就从内存中释放其值,而静态局部变量不释放,等整个程序全部执行结束后才会从内存中释放。

现在的社会是一个高速发展的信息化时代,尤其是各种软件出现在我们的生活里面,带来更快的节奏发展,而这些软件都是通过编程语言来编写的,最基础的语言自然也是c语言,更是无数程序员入门的语言,其中关于字符串常量很多人很是疑惑C语言static 加在字符数组中才能得到正确的字符串,什么原理?其实就是静态资源,可以作为常理,自然也就是字符串了,我们来具体分析一下吧。

首先要知道c语言是面向过程的语言,它很多地方并不像java,c++等优秀,尤其是字符串这里,没有这个类型,而是通过字符数组来实现字符串的效果,也就是通过一组容器来存储多个数字达到字符串的效果,但是仅仅只是字符串数目并非真正意义上的字符串,字符串在任何语言里面这是静态资源,甚至可以说是常量池里面的东西,所以c语言想要实现真正意义上的字符串,必须static 加在字符数组前面。

当然每一门语言都是不一样的,比如java就可以直接string或者stringbuff进行定义,不过两者也有很大的区别,比如string是final所修饰,这是不可更改的,因此每次新建元素都是开辟一个新的空间,而stringbuff并不会,自己带有数组缓冲区,所以自然不会新建一个空间,只要字符串一样就可以。

在这里也比较推荐大家,如果想要入门程序员行业的话,完全可以选择c语言作为基础先学一段时间,有编程语言一定的理解后,就可以直接开始java语言等面向对象的语言学习了。

c语言中静态变量作常量使用,用于存储常数。可用const,constant或final等关键字标识,其值就会在编译时设定,并且无法在运行时改变。编译器通常将静态常量与文本一起置于目标文件的文本区域,而非常量初始化数据则置于数据区;而如若有需要,有些编译器还可选择为其开辟专用区。

对于静态全局变量来说,针对某一源文件的以static声明的文件级变量与函数的作用域只限于文件内(只在文件内可见),也即“内部连接”,因而可以用来限定变量的作用域。

扩展资料:

在函数内以static声明的静态局部变量虽然与自动局部变量的作用域相同(即作用域都只限于函数内),但存储空间是以静态分配而非默认的自动分配方式获取的,因而存储空间所在区域不同。

一般来说,静态分配时存储空间于编译时在程序数据段分配,一次分配全程有效;而自动分配时存储空间则是于调用栈上分配,只在调用时分配与释放,且两次调用间变量值始终保持一致;必须注意,静态局部变量只能初始化一次,这是由编译器来保证实现。

以上就是关于C语言静态变量定义时赋初值和不赋初值全部的内容,包括:C语言静态变量定义时赋初值和不赋初值、C语言问题,要求是学习static定义静态变量的用法,请问下面这个程序符合要求吗,谢谢、C语言的,帮我编一下.谢谢了等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10193025.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-06
下一篇2023-05-06

发表评论

登录后才能评论

评论列表(0条)

    保存