从main函数开始,逐句分析:
成都创新互联公司10多年成都企业网站建设服务;为您提供网站建设,网站制作,网页设计及高端网站定制服务,成都企业网站建设及推广,对成都岗亭等多个领域拥有多年的网站营销经验的网站建设公司。
main函数的第一句定义了三个int(整型)变量a, i, k,a的值被初始化为4;
第二句是一个循环,该循环将i的值定义为0,当i的值小于2时,循环条件通过,每循环一次,i的值就会加1,由此可知,该循环会执行两次。
在循环体中,包含了语句k=f(a++);,由后置递增符的性质可知,后置递增符会先使用变量的值,使用完后,对变量进行递增。由此可知,传入函数的值即为a的值。
进入函数,f(int a)中的a的值即为传入的值,为4。逐句分析f()函数:
第一句,定义整型变量b的值为0,该变量的生存期和作用域为这个函数。
第二句,定义静态整型变量c的值为9,该变量的作用域为这个函数,但是生存期为整个文件。
第三句,由于使用的是后置递增符,先使用值,后递增,所以c的值被赋给a后才会增加,后接b++。本语句结束后,c和b的值都增加了1,c的值变成了10,b的值变成了1。
第四句,return以变量a的值作为返回值。
回到main函数的第二句,k的值被修改成为了f()函数的返回值,即在f()函数中a的值。要注意的是,以传值方式传入函数的值并不会改变值本身,而是相当于在函数中复制了一个副本使用。
该语句执行完毕后,main函数中的变量a的值增加了1。
此时是for循环的第一次循环结束,进入第二次循环,同样的传入a的值,由于之前递增过一次,所以现在它的值是5。重新进入f()函数。
在f()函数中,由于其他的变量的生存期是函数,在上一次f()函数结束时,变量b被销毁了,所以重新进入变量后,变量b的值又变回了0。但由于c的生存期没有结束,c的值不变,所以重新进入函数后,c的值仍然是10。c的值赋给a,所以在执行语句return a;时变量a的值是10,即函数的返回值是10。返回后该值赋给k,使得k的值变成了10。循环结束,跳出循环。
第三句,执行printf()函数,屏幕上输出的值是10。
第四句,return 0; 程序结束。
本题主要的难点在于对变量生存期的判定,即对static关键字的理解与掌握,忽视了函数中拥有文件生存期的变量在使用时值得变化原理。同时,后置递增运算符同样也是引起疑惑的原因之一。
//希望我的回答对你的学习有帮助
#include stdio.h
int Factorial(int n)
{
int fac = 1;
for (int i = 1; i = n; i++)
{
fac *= i;
}
return fac;
}
int main()
{
int sum = 0;
for (int i = 1; i = 10; i++)
{
sum += Factorial(i);
}
printf("1! + 2! + 3! ... + 10! = %d\n", sum);
return 0;
}
修改后的C语言程序:
#include stdio.h
void triangle(int g)
{
int n=1, m; /* 修改处1 */
for(n;n=g; n++)
{
for(m=1;m=2*n-1;m++) /* 修改处2 */
putchar('*');
putchar('\n');
}
}
void rectangle(int g)
{
int n=1, m; /* 修改处3 */
for(n;n=g;n++)
{
for(m=1;m=3;m++) /* 修改处4 */
putchar('*');
putchar('\n');
}
}
int main()
{
int i,k;
printf("请输入行数(大于3):");
scanf("%d",i);
printf("请选择图形:1---三角形 \t2---矩形\t3---小旗 :");
scanf("%d",k);
if(k==1)
{
triangle(i);
}
if(k==2)
{
rectangle(i);
}
if(k==3)
{
triangle(i);
rectangle(i);
}
return 0;
}
# include stdio.h
# include math.h
int main(void)
{
//把三个系数保存到计算机中
int a = 1; //=不表示相等,表示赋值
int b = 5;
int c = 6;
double delta; //delt存放的是 b*b - 4*a*c
double x1; //存放一元二次方程的其中一个解
double x2; //存放一元二次方程的其中一个解
delta = b*b - 4*a*c;
if (delta 0)
{
x1 = (-b + sqrt(delta)) / (2*a);
x2 = (-b - sqrt(delta)) / (2*a);
printf("该一元二次方程有两个解, x1 = %f, x2 = %f\n", x1, x2);
}
else if (delta == 0)
{
x1 = (-b) / (2*a);
x2 = x1; //右边赋给左边
printf("该一元二次方程有一个唯一解, x1 = x2 = %f\n", x1);
}
else
{
printf("无解\n");
}
return 0;
}