首先void de(int a[],int x,int *m)函数:
成都创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都做网站、网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的瓦房店网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
void de(int a[],int x,int *m) // 函数形参为数组a[],整型x,整型指针*m
{ int i=x+1; //定义i=x+1
for(;i=*m;i++) a[i-1]=a[i]; //for循环,从i位置起,将后面的数组元素向前移动一个位置。
*m=*m-1; //*m-1,也就是数组长度减1
}
该函数的作用是将数组a[]从x位置起,把后面的元素向前移动,覆盖(删除)掉x位置的元素。
然后,主函数中static的意思:
static是将数组a[]声明为静态局部变量(main函数内),静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。这个具体的你得看看书,了解下,不过在这里可以无视掉,无特殊作用。
最后主函数:
第一层for循环中,读取第一个数组元素赋值给x。然后第二层for循环中,依次将x与比较后面的值比较,如果发现重复值,则利用de()函数将重复的元素删除。最后一个for循环输出。
另外需要说一下的是,de(a,j,m)的意思,数组做实参时直接使用数组名即可,如a。j为普通的形参。而m的意思是将变量m的地址作为形参,这是指针作为实参时的使用方法,地址为实参,作用是这样de()函数中便可直接对m值进行操作。
1.
函数fun中z是静态局部变量,只初始化一次。
2.
%3d表示输出整数时占3个字符宽度,右对齐,左边填充空格扩充到3个字符宽。
所以,调用:
fun(1);时开始x等于1,y等于0,z等于3,z+=1;后z等于4,++y;后y等于1,返回1+1+4,返回6,输出 6(6前面有两空格)。
fun(2);时开始x等于2,y等于0,z等于4(保留上次调用后的值),z+=1;后z等于5,++y;后y等于1,返回2+1+5,返回8,输出 8(8前面有两空格)。
fun(3);时开始x等于3,y等于0,z等于5(保留上次调用后的值),z+=1;后z等于6,++y;后y等于1,返回3+1+6,返回10,输出 10(10前面有两空格)。
所以,总的输出是 6 8 10(每个数字前都有两个空格)。
我调试了..你的答案是对的..参考答案是错的..不要盲信参考答案..要自己去验证一下..
我学的教科书还有好多错的呢...
答案是:7。
被调函数sub是一个递归函数,有两处注意点:
一、参数1这里传递的是实参x的地址,因此sub函数中a地址里的值改变,x的值也变。
二、注意sub中if没有大括号,作用域仅限下一句代码,也就说*a+=k;这句代码是在if作用域之外的。无论if判读成不成立,*a+=k;都会执行。
所以按照递归顺序执行:
第一层:n的值为8,k的值为1。执行代码:sub(x地址,4,2);x+=1;(*a的值就是x的值)
第二层:n的值为4,k的值为2。执行代码:sub(x地址,2,4);x+=2;
第三层:n的值为2,k的值为4。执行代码:x+=4;
递归函数中自调后的代码是从最底层往开始执行,一层一层往回返回的。
所以实际执行顺序是:x+=4;x+=2;x+=1。
x初值0,所以是7。