请问这道c语言题怎么做?

求尽量详细些的解答,谢谢!
2024-04-30 08:29:51
推荐回答(3个)
回答1:

从main函数开始,逐句分析:

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关键字的理解与掌握,忽视了函数中拥有文件生存期的变量在使用时值得变化原理。同时,后置递增运算符同样也是引起疑惑的原因之一。

回答2:

注意,函数f返回的的是形参a的值,而形参a的值由表达式

a=c++决定

注意变量c的存储类型是static,所以即便推出了函数,变量的原值都会保存

共调用了2次f函数,,第二次调用f函数时,b值已经自增为10,所以打印输出10

回答3:

#include 

#include 

void sort(int* s, int n)

{

int i = 0, j = 0, index = 0;

int c;

for (; i < n; i++)

{

c = s[i];

index = i;

for (j = i + 1; j < n; j++)

{

if (s[j] < c)

{

index = j;

c = s[j];

}

}

if (index != i)

{

c = s[index];

s[index] = s[i];

s[i] = c;

}

}

}

int duplicate(int* s, int n)

{

int j = 0;

for (int i = 0; i < n - 1;)

{

while (i < n - 1 && s[i] == s[i + 1]) i++;

if(i < n - 1 && s[j] != s[i + 1]) s[++j] = s[++i];

}

if (s[n - 1] != s[j]) s[++j] = s[n - 1];

return j + 1;

}

int main()

{

int n, s[101];

scanf("%d", &n);

for (int i = 0; i < n; i++)

scanf("%d", &s[i]);

sort(s, n);

int m = duplicate(s, n);

printf("%dn", m);

for (int i = 0; i < m; i++)

{

printf("%d ", s[i]);

}

printf("n");

return 0;

}