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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

若有定义:int a[2][3],则对a数组的第i行j列元素地址的正确引用为___d___.

a)*(a[i]+j) b)(a+i) c)*(a+j) d)a[i]+j

以下正确的程序段是_________.

a)char str[20]; b)char *p;

scanf("%s",&str); scanf("%s",p);

c)char str[20]; d)char str[20],*p=str;

scanf("%s",&str[2]); scanf("%s",p[2]);

下面程序的运行结果是_______.

#include

#include

fun(char *w,int n)

{char t,*s1,*s2;

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

while(s1

}

main()

{

char p[] = “1234567”;

fun(p,strlen(p));

puts(p);

}

a)7654321 b)1714171 c)1711717 d)7177171

下面程序段的运行结果是__ hELLO!______.

char s[80],*sp="HELLO!";

sp=strcpy(s,sp);

s[0]='h';

puts(sp);

.下面程序段的运行结果是__ef_____.

char str[]="abc\0def\0ghi",*p=str;

printf("%s",p+5);

设有如下定义:int x = 1, y = -1;,则语句:printf(“%d\n”, (x--&++y));的输出结果是:B

A. 1

B.0

C.-1

D. 2

设有如下定义:int a, b;,则语句:printf("%d", (a = 5) && (b = -1));的输

出结果是:A

E. 1

F. 5

G.-1

H.不确定

程序执行后的输出结果是:n = 3

int i, n = 0;

for (i = 2; i < 7; i++) {

do {

if (i % 3) {

continue;

}

--n;

} while(!i);

n++;

}

printf("n = %d\n", n);

1.以下代码,哪一句是非法的?____最后一句s.p[0] = 2;____

struct po_s

{

int i;

int *p;

};

int main(void)

{

struct po_s s;

int *p;

p = &s.i;

p[0] = 4;

p[1] = 3;

s.p = p;

s.p[1] = 1;

s.p[0] = 2;

return 0;

2.以下代码,输出什么?____a3, BB(注意大小写)____

int a[5] = {0x1a,0xa3,0xd3,0xe4,0xbb};

int *ptr;

ptr = (int *)(&a + 1);

printf("%x, %X", *(a + 1), *(ptr - 1));

3.下面的代码输出是什么,为什么?

void foo(void)

{

unsigned int a = 0x10;

int b = -20;

(a + b > 6) ? 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)以上均不对

相关文档
最新文档