c语言陷阱试题,超级经典c语言陷阱考试题.doc

fun(char *w,int n)

{char t,*s1,*s2;

s1=w;s2=w+n-1;

while(s16) ? puts("> 6") : puts("<= 6");

}

输出>6

因为表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。

4. 说明以下两个语句的作用,哪个更好?为什么?

#define PS struct po_s*

typedef struct po_s* PS_t;

这两个语句是将PS 和 PS_t 作为一个指向结构po_s指针。typedef更好。

因为如下代码

PS p1, p2;

PS_t p3, p4;

p1为一个指向结构的指,p2为一个实际的结构,这也许不是你想要的。第二个例子正确地定义了p3 和p4 两个指针。

5. 下面两段代码一样吗?为什么?

int square(volatile int *ptr)

{

int a, b;

a = *ptr;

b = *ptr;

return a * b;

}

int square(volatile int *ptr)

{

int a;

a = *ptr;

return a * a;

}

由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。第一段段代码返回的可能不是你所期望的平方值。

#include

static jmp_buf buf;

main(b)

{

volatile int b;

b =3;

if(setjmp(buf)!=0)

{

printf("%d ", b);

exit(0);

}

b=5;

longjmp(buf , 1);

}

请问, 这段程序的输出是

(a) 3

(b) 5

(c) 0

(d) 以上均不是

考查多维数组与指针

void foo(int [][3]);

main()

{

int a [3][3]= { { 1,2,3} , { 4,5,6},{7,8,9}};

foo(a);

printf("%d" , a[2][1]);

}

void foo(int b[][3])

{

++ b;

b[1][1] =9;

}

这段程序的输出是: b

(a) 8

(b) 9

(c) 7

(d)以上均不对

考查自减操作(--)

void e(int );

main()

{

int a;

a=3;

e(a);

}

void e(int n)

{

if(n>0)

{

e(--n);

printf("%d", n);

e(--n);

}

}

void f(char**);

main()

{

char * argv[] = { "ab" ,"cd" , "ef" ,"gh", "ij" ,"kl" };

f( argv );

}

void f( char **p )

{

char* t;

t= (p+= sizeof(int))[-1];

printf( "%s" , t);

}

这段程序的输出是: b

(a) ab

(b) cd

(c) ef

(d) gh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值