c语言用三目运算符从小到大排列,错题集

本文详细探讨了C语言中的结构体和指针的使用,包括结构体成员的引用、指针操作、类型定义、文件操作、数组与指针的关系以及三目运算符等知识点。通过实例解析了结构体成员的访问、指针变量的赋值以及如何通过指针操作结构体成员。此外,还介绍了字符串赋值、switch语句、循环控制以及内存分配等方面的内容。
摘要由CSDN通过智能技术生成

1、若有以下说明和语句:

struct Student

{

int num;

int age;

}stu,p;

p=&stu;

则可以用p.age引用stu中成员age

标准答案:N您的答案:Y

解析:p.age就是(p.age),解引用操作符*的优先级比.点操作符的低

2、定义结构体typedef struct one { int a;}s; s a;则a为结构体变量()

标准答案:Y您的答案:N

解析:用typedef声明新类型名s

3、结构体和共用体成员的应用都可能引用最低一级的成员。

标准答案:Y您的答案:N

解析:(1)对最低一级成员,可像同类型的普通变量一样,进行相应的各种运算。

(2)既可引用结构变量成员的地址,也可引用结构变量的地址。

4、有以下定义和语句,则sizeof(a)的值是 ,而sizeof(a.share)的值是 。(VC环境中)

struct date

{int day;

int month;

int year;

union

{int share1;

float share2;

}share;

}a;

标准答案:

16

4

您的答案:

10

4

5、设有以下结构体类型说明和变量定义,则变量a在内存中所占的字节数是 。(VC环境中)

struct stud

{char num[6];

int s[4];

double ave;

}a;

标准答案:

32

您的答案:

24

解析:排列时要以最大字节数的类型为基准,来排列

不够的就补位。

此题最大字节数是8所以以8为基准第一排6+2

第二排8

第三排8

第四排8

所以一共占字节4*8=32.所以答案是32字节。

6、以下选项中不属于C语言的类型是()

A: signed short int

B: unsigned long int

C: unsigned int

D: long short

标准答案:D您的答案:A

解析:在选项中很明显选项A为无符号短整型,选项B为无符号长整型,选项C为无符号整型,而选项D的类型在C语言中不存在。

7、在C语言中,合法的字符常量是( )。

A: ‘\084’

B: ‘\x43’

C: ‘ab’

D: “\0”

标准答案:B您的答案:D

解析:“\0”应改为‘\0’

8、

若要向一个已存在的文件追加新的信息,只能用“a ”方式打开文件。但此时该文件必须是存在的,否则将会出错。

标准答案:Y您的答案:N

错误原因:做提前未认真阅读书本

9、

若有以下定义,且0≤i<4,则不正确的赋值语句是_______.

int b[4][6], *p, *q[4];

A: q[i] = b[i];

B: p = b;

C: p = b[i]

D: q[i] = &b[0][0];

标准答案:B 您的答案:D

解析:

B:由题目中的定义可知p是针对一维数组的,而b则是二维数组,所以不可以直接这样赋值。

D:而q[4]是二位指针数组,b也是二维数组,所以D的赋值是可以的。

注意:一个*是针对一维数组,两个**则是针对二维数组的。

10、“n是大于整数m的奇数”的C语言表达式是___________。

标准答案:

(n>m)&&(n%2==1)

您的答案:

n>m&&n%2!=0;

解析:首先n对2求与等于0可以判断n是偶数,然后再与上一个n

本回答由提问者推荐

11、若a是int型变量,则表达式(a=45, a2), a+6的值为 。

标准答案:

26

您的答案:

46

解析:(a=45,a2),a+6,括号优先级最高先算括号里,括号里a=45=20即是(20,202),20+6所以结果26

12、以下程序的输出结果是( )。

main()

{int i,j,m=0,n=0;

for(i=0;i<2;i++)

for(j=0;j<2;j++)

if(j>=i) m=1;n++;

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

}

A: 4

B: 2

C: 1

D: 0

标准答案:C您的答案:A

解析:main() {int I,j.m=0.n=0; for(I=0;I<2;I++) for(j=0;j<2;j++) if(j>=i)m=1;n++;/本行语句虽然包含"n++",但不包括在任何循环体内/ printf("%d\n",n): }

13、

已定义以下函数:

int fun(int *p){return *p;}

fun函数返回值是 ( )

A: 一个整数

B: 形参p的地址值

C: 形参p中存放的值

D: 不确定的值

标准答案:C 您的答案:A

解析:

在函数中传入的形参是一个指针变量,之后return 返回的值是这个指针变量中所存放的值。而A答案一个整数太笼统,地址也可以是一个整数,所以选C答案更加全面具体。

14、

若a、b、c1、c2、x、y均是整型变量,正确的switch语句是( )。

A) swich(a+b);            B) switch(aa+bb)

{case 1:y=a+b; break; {case 3:

case 0:y=a-b; break; case 1:y=a+b;break;

} case 3:y=b-a;break;

}

C) switch a              D) switch(a-b)

{case c1 :y=a-b; break; {default:y=ab;break;

case c2: x=ad; break; case 3:case 4:x=a+b;break;

default:x=a+b; case 10:case 11:y=a-b;break;

} }

A: 在题目中

B: 在题目中

C: 在题目中

D: 在题目中

标准答案:D 您的答案:C

解析:

A:swich表达式后面多了个分号。

B:里面的执行语句中不能重复出现相同的常量,否则会矛盾。

C:case后面的不能是变量,必须是常量。

故只有D答案正确。

15、若运行时给变量x输入12,则以下程序的运行结果是( )。

main()

{int x,y;

scanf(“%d”,&x);

y=x>12?x+10:x-12;

printf(“%d\n”,y);

}

A: 0

B: 22

C: 12

D: 10

标准答案:A您的答案:B

解析:本题考查三目运算符“:”。表达式“x>12x+10:x-12”即,如果x>12成立,则x+10的值即为此表达式的值,否则x-12即为此表达式的值。因为x=12,所以x>12不成立,所以执行y=x-12=0。

16、下面能正确进行字符串赋值操作的是

A: char s[5]={“ABCDE”};

B: char s[5]={ ′A′, ′B′, ′C′, ′D′, ′E′};

C: char *s;s=“ABCDE”;

D: char *s;char a; scanf("%s",&s);

标准答案:C您的答案:A

解析:如果一个字符数组用来存储字符串,那么在定义该字符数组时,数组的大小应该比它将要实际存放的字符串长度大1,所以选项A)和B)错。选项D)e本身就是一个字符指针,不需再取地址。

17、

以下程序的输出结果是( )。

main()

{int n[5]={0,0,0}, i, k=2;

for(i=0; i

printf("%d\n", n[k]);

}

A: 不确定的值

B: 2

C: 1

D: 0

标准答案:D您的答案:C

18、以下程序的输出结果是( )。

#include

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

main()

{p=(int *)malloc(sizeof(int));

f(p, a);

printf(“%d\n”,*p);

}

f(int *s, int p[][3])

{*s=p[1][1];}

A: 1

B: 4

C: 7

D: 5

标准答案:D您的答案:B

解析:本题考查了二维数组元素引用的方法。题中用动态存储分配函数malloc分配了一个int型数据长度大小的内存,然后指针p指向了这段内存,函数f()中对p所指向的数据进行了赋值,p[1][1]为二维数组第二行第二列的元素,对应于实参a的元素5,所以输出结果为5。

19、以下for语句构成的循环执行了( )次。

#define N 2

#define M N+1

#define NUM (M+1)*M/2

main()

{int i, n=0;

for(i=1; i<=NUM; i++)

{n++;

printf("%d", n);

}

printf("\n");

}

A: 4

B: 6

C: 8

D: 9

标准答案:C您的答案:B

解析:如题可知,N=2,M=3,NUM=6 循环判断条件为i

20、已有定义int k=2,*ptrl,*ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值语句是( )

A: k=*ptr1+*ptr2

B: ptr2=k

C: ptr1=ptr2

D: k=ptr1(*ptr2)

标准答案:B您的答案:A

解析:k为int 型变量 ptr2为指针类型,不能直接复制,除非强制转换

ptr2=(int *)k;

21、若有语句int a[10]={0,1,2,3,4,5,6,7,8,9},*p=a;则( )不是对a数组元素的正确引用(其中0≤i<10)。

A: p[i]

B: ((a+i))

C: a[p-a]

D: (&a[i])

标准答案:B您的答案:A

解析:(a+i)指向a[i]存的那个值,假设i=1,则等于a[1]=1,再求1所指向的地址的值,不能求

22、请读程序:

main()

{

int x=1, y=0, a=0, b=0;

switch(x)

{

case 1:

switch(y)

{case 0:a++;break;

case 1:b++;break;

}

case 2:

a++; b++; break;

}

printf(“a=%d, b=%d\n”, a, b);

}

上面程序的输出结果是( )。

A: a=2,b=1

B: a=1,b=1

C: a=1,b=0

D: a=2,b=2

标准答案:A您的答案:C

23.下面程序段中,for循环的执行次数是( )。

char *s=”\ta\018bc”;

for( ;s!=’\0’; s++) printf(“”);

A: 9

B: 5

C: 6

D: 7

标准答案:C您的答案:A

解析:数据成员内存的占用

若有语句:intp,a=4;和p=&a;下面均代表地址的一组选项是( )

A: a,p,&a

B: &*a,&a,*p

C: *&p,*p,&a

D: &a,p,&*p

标准答案:D您的答案:B

解析:p是指针, a是变量。 所以 &a, 或者p,或者&p, 都是地址。

A里面 a不是地址。 *&a等效于a 也不是地址 。

B里面 *a本身就是非法的。 &*a属于非法表达式。 *p是值,不是地址。

C里面 *p不是地址,而是值。 注意 *&p 等效于p, 这个是地址。

D里面 &a &*p和p都是地址。 这里 &*p等效于p。

p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确执行的赋值语句是( )

A: c=*p1+*p2

B: p2=c

C: p1=p2

D: c=p1(*p2)

标准答案:B您的答案:D

解析:指针是不能相加的 ,没有意义的。只有大小比较和相减运算。因为地址在内存中是从小到大按直线排列的 所以是可以比较大小的

指针相减是相差多少位,它除以所占字节就是指针间元素的个数。

26.若有语句int a[10]={0,1,2,3,4,5,6,7,8,9},*p=a;则( )不是对a数组元素的正确引用(其中0≤i<10)。

A: p[i]

B: ((a+i))

C: a[p-a]

D: (&a[i])

标准答案:B您的答案:C

解析:(a+i)指向a[i]存的那个值,假设i=1,则等于a[1]=1,再求1所指向的地址的值,不能求

27.下面不能正确进行字符串赋值操作的是( )。

A: char s[6]={“ABCDE”};

B: char s[5]={‘A’,'B’,'C’,'D’,'E’};

C: char *s;s=”ABCDE”;

D: char *s; scanf(“%s”,s);

标准答案:B您的答案:C

解析:选项A)和B)定义的数组空间太小,至少应该为6个字符的长度才可以。选项D)中的指针s未赋初值,所以指向一个不确定的地址,因而不能用scanf输入数据到这一指针所指向的地址中。

28.若有以下定义,则说法错误的是( )。

int a=100,p=&a ;

A: 声明变量p,其中表示p是一个指针变量

B: 变量p经初始化,获得变量a的地址

C: 变量p只可以指向一个整形变量

D: 变量p的值为100

标准答案:D您的答案:B

解析:p是一个指针,用来存储a变量的地址,而100是存储在该地址的一个值用p表示的为-p。

29.有如下语句int a=10,b=20,*p1,*p2;p1=&a;p2=&b;如图1所示,若要实现图2所示的存储

a697aabac5ae1ec0dbc3768ddedd028d.png

结构,可选用的赋值语句是( )。

A: *p1=*p2;

B: p1=p2;

C: p1=*p2;

D: *p1=p2;

标准答案:B您的答案:A

解析:

因为p1和p2都是指针变量,所以可以直接不用带星号的赋值,将p2的地址赋给p1。所以B答案是对的。

30、

若要用fopen函数打开一个新的二进制文件,该文件要既能读也能写,则文件方式字符串应是( )

A: “ab+”

B: “wb+”

C: “rb+”

D: “ab”

标准答案:B 您的答案:C

解析:

C:是为了读和写打开一个已存在的二进制文件。

B:为了读和写建立一个新的二进制文件。

题目要求是打开一个新的二进制文件即为新建,所以选B是正确的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值