几道练习题

来源:互联网 发布:空军知乎 编辑:程序博客网 时间:2024/06/05 10:23
写出输出结果


1.

#include <stdio.h>void g(int**);int main(){       intline[10],i;       int*p=line; //p是地址的地址       for(i=0;i<10;i++)       {              *p=i;              g(&p);//数组对应的值加1       }       for(i=0;i<10;i++)       printf("%d\n",line[i]);       return0;} void g(int**p){       (**p)++;//值++       (*p)++;//指针++}

输出:

1 2 3 4 5 6 7 8 9 10


2.

#include <stdio.h>int main(){int arr[] = {6,7,8,9,10};int *ptr = arr;*(ptr++)+=123;printf("%d \n", *ptr);printf("%d %d \n", *ptr, *(++ptr));return 0;}

输出:

7

8 8

过程:对于*(ptr++)+=123;先做加法6+123,然后++,指针指向7;对于printf(“ %d %d ”, *ptr, *(++ptr));从后往前执行,指针先++,指向8,然后输出8,紧接着再输出8


3.

#include <stdio.h>void foo(int m, int n){    printf("m=%d, n=%d\n", m, n);}int main(){    int b = 3;    foo(b+=3, ++b);    printf("b=%d\n", b);return 0;}

输出:m=7,n=4,b=7(VC6.0)

这种方式和编译器中得函数调用关系相关即先后入栈顺序。不过不同

编译器得处理不同。也是因为C标准中对这种方式说明为未定义,所以

各个编译器厂商都有自己得理解,所以最后产生得结果完全不同。

因为这样,所以遇见这种函数,我们首先要考虑我们得编译器会如何处理

这样得函数,其次看函数得调用方式,不同得调用方式,可能产生不同得

结果。最后是看编译器优化。



原创粉丝点击