从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关键字的理解与掌握,忽视了函数中拥有文件生存期的变量在使用时值得变化原理。同时,后置递增运算符同样也是引起疑惑的原因之一。
2022-04-17
注意,函数f返回的的是形参a的值,而形参a的值由表达式
a=c++决定
注意变量c的存储类型是static,所以即便推出了函数,变量的原值都会保存
共调用了2次f函数,,第二次调用f函数时,b值已经自增为10,所以打印输出10
#include <stdio.h>
#include <string.h>
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;
}