逛论坛看到了一个很好的帖子,考C语言基础的,惭愧有很多不懂,转过来慢慢学习。顺便附上自己的见解和验证
原帖地址:
http://topic.csdn.net/u/20110729/12/9973E5A4-A414-4714-871F-905A85612297.html
1,The output for this program is: (a) 3 (b) 5 (c) 0
#include < setjmp.h >static jmp_buf buf;int main() {volatile int b;b = 3 ;if (setjmp(buf) != 0 ) {printf( " %d " , b);exit( 0 );}b = 5 ;longjmp(buf , 1 );return 0 ;}
由于我是使用VC的,volatile之前从来没用过,所以上网搜了下volatile这个关键字,稍微了解下。
推荐一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
所以volatile int b的值不会变,仍然是3。
2,The output for this program is: (a) 3 (b) 5 (c) 6 (d) 7
struct node { int a; int b; int c; };int main() {struct node s= { 3, 5,6 };struct node *pt = &s;printf("%d" , *(int*)pt);return 0;}
答案:a,不需要多解释
3,What function of x and n is compute by this code segment?
(a) x^n (b) x*n (c) n^x (d) None of the above
C/C++ code
int foo ( int x , int n) {
int val;
val =1;
if (n>0) {
if (n%2 == 1) val = val *x;
val = val * foo(x*x , n/2);
}
return val;
}
答案:a
这个函数的作用是,如果幂为奇数,乘以本身,将幂转化为偶数再计算
如果幂是偶数,则等价于底的平方的n/2次幂,如此循环一直到n==1
它的作用等价于x的n次方
4,The output for this program is: (a) 2 2 (b) 2 1 (c) 2 5 (d) None of the above
C/C++ code
int main() {
int a[5] = {1,2,3,4,5};
int *ptr = (int*)(&a+1);
printf("%d %d" , *(a+1), *(ptr-1) );
return 0;
}
答案:C
指针+1的跨度跟指针的类型有关,由于a是一个包含5个int数的数组,所以&a+1的跨度是sizeof(int)*5
而ptr是int*指针,所以ptr-1的跨度是sizeof(int)5,The output for this program is: (a) 8 (b) 9 (c) 7 (d) None of the above
C/C++ code
void foo(int [][3] ); int main(){ int a [3][3]= { { 1,2,3} , { 4,5,6},{7,8,9}}; foo(a); printf("%d" , a[2][1]); return 0;} void foo( int b[][3]) { ++ b; b[1][1] =9; }
答案:b++b后&b == &a[1][0]
6,The output for this program is: (a) c=3 d=3 (b) c=5 d=3 (c) c=3 d=5 (d) c=5 d=5
C/C++ code
int main() { int a, b,c, d; a=3; b=5; c=a,b; d=(a,b); printf("c=%d" ,c); printf("d=%d" ,d); return 0;}
答案:c
c=a,b;
很明显,此时b跟c没有任何关系,
我们常用的int a=1,x,y;
x,y跟a是没有任何关系的
d=(a,b);
这个不清楚原理,有哪位高手指点一下。
7,The output for this program is:(a) 2 3 5 6 (b) 2 3 4 5 (c) 4 5 0 0 (d) None of the above
C/C++ code
int main() { int a[][3] = { 1,2,3 ,4,5,6}; int (*ptr)[3] =a; printf("%d %d " ,(*ptr)[1], (*ptr)[2] ); ++ptr; printf("%d %d" ,(*ptr)[1], (*ptr)[2] ); return 0;}
答案:a
跟之前一样 ++ptr,跨度为sizeof(int)*38,Which of the above three functions are likely to cause problem with pointers (a) Only f3 (b) Only f1 and f3 (c) Only f1 and f2 (d) f1 , f2 ,f3
C/C++ code
int *f1(void) { int x =10; return(&x); } int *f2(void) { int*ptr; *ptr =10; return ptr; } int *f3(void) { int *ptr; ptr=(int*) malloc(sizeof(int)); return ptr; }
答案:C
看到这个题目,第一反应就是f1肯定是错的,但实际测试的时候却发现,调用int* ptr = f1()后,*ptr,却是10,难道x永远活在我们心中。。
上网搜了下才知道为什么还能打印出10,基本原理就是虽然x超出了生命周期,但是int数据没有析构,而我测试时x所在的堆栈空间还没被调用覆盖,
所以打印*ptr仍然会打印出10,
这是一篇很好玩的专家门诊,大家有兴趣的话看看吧~
http://blog.tianya.cn/blogger/post_show.asp?BlogID=12983&PostID=751498f2使用野指针,肯定错的。
9,The output for this program is: (a) i=4 j=2 (b) i=3 j=2 (c) i=3 j=4 (d) i=3 j=6
C/C++ code
int main() { int i=3; int j; j = sizeof(++i+ ++i); printf("i=%d j=%d", i ,j); return 0;}
答案:C
怀疑是因为先传参再进行++i操作,因为时间传递的参数是实参的副本,所以i的值不会变化
这里有个优先级的问题,是先传参再计算呢,还是先计算再传参呢,
实际测试来看,还是先传参再计算的。。10,The output for this program is: (a) 5 5 5 5 (b) 3 5 3 5 (c) 5 3 5 3 (d) 3 3 3 3
C/C++ code
void f1(int *, int); void f2(int *, int); void(*p[2]) ( int *, int); int main() { int a; int b; p[0] = f1; p[1] = f2; a=3; b=5; p[0](&a , b); printf("%d\t %d\t" , a ,b); p[1](&a , b); printf("%d\t %d\t" , a ,b); return 0;} void f1( int* p , int q) { int tmp; tmp =*p; *p = q; q= tmp; } void f2( int* p , int q) { int tmp; tmp =*p; *p = q; q= tmp; }
答案:a
我没看出f1和f2有什么区别。。
还是传参问题,传参传的是副本,所以修改形参不会改变实参的值,但修改形参指向的内存地址会改变实参指向的内存地址的值11,The output for this program is: (a) 0 1 2 0 (b) 0 1 2 1 (c) 1 2 0 1 (d) 0 2 1 1
C/C++ code
void e(int ); int main() { int a; a=3; e(a); return 0;} void e(int n) { if(n>0) { e(--n); printf("%d" , n); e(--n); } }
答案:a
比较乱,不乱的时候再来理一下
12,type of tmp is (a) Pointer to function of having two arguments that is pointer to float (b) int (c) Pointer to function having two argument that is pointer to float and return int (d) None of the above
C/C++ code
typedefint (*test) (float* , float*)
test tmp;
答案:C
函数指针的定义13,The output for this program is: (a) 5 (b) 6 (c) 9 (d) None of the above
C/C++ code
int main() { char *p; char buf[10] ={ 1,2,3,4,5,6,9,8}; p = &((buf+1)[5]); printf("%d" , *p); return 0;}
答案:C
相当于buf[6]14,The output for this program is: (a) ab (b) cd (c) ef (d) gh
C/C++ code
Void f(char**);int main() { char * argv[] = { "ab" ,"cd" , "ef" ,"gh", "ij" ,"kl" }; f( argv ); return 0;} void f( char **p ) { char* t; t= (p+= sizeof(int))[-1]; printf( "%s" , t); }
答案:D
15,The output for this program is: (a) 7 (b) 6 (c) 5 (d) 3
#include < stdarg.h >int ripple ( int , ...);int main(){int num;num = ripple ( 3 , 5 , 7 );printf( " %d " , num);return 0 ;}int ripple ( int n, ...) {int i , j;int k;va_list p;k = 0 ;j = 1 ;va_start( p , n);for (; j < n; ++ j) {i = va_arg( p , int );for (; i; i &= i - 1 )++ k;}return k;}
16, The value of j at the end of the execution of the this program is:
(a) 10 (b) 15 (c) 6 (d) 7
int counter ( int i) {static int count = 0 ;count = count + i;return (count );}int main() {int i , j;for (i = 0 ; i <= 5 ; i ++ )j = counter(i);return 0 ;}
答案:B
从0加到5