C语言选择题_初学者易误(量大管饱)

精选C语言选择题_详细解答

 这些题有些是初学者易错的题,有些是我认为不错的题,诚信地奉献给大家~\\qwq//~

 较简单的题目,解析我用的文字

 较复杂的题目,我画了图进行详细的解答~

题目

1.以下不正确的定义语句是( )

A: double x[5] = {2.0, 4.0, 6.0, 8.0, 10.0};
B: char c2[] = {'\x10', '\xa', '\8'};
C: char c1[] = {'1','2','3','4','5'};
D: int y[5+3]={0, 1, 3, 5, 7, 9}; 

正确答案:B
本题B选项考查转义字符,有如下格式,但八进制数字是0-7,没有8,故B选项中'\8'是错误的
\ddd ddd表示1到3个八进制数 如:\130 转义为 字符X
\xhh hh表示1到2位十六进制数 如:\x30 转义为 字符0

2.test.c 文件中包括如下语句,文件中定义的四个变量中,是指针类型的变量为【多选】( )

#define INT_PTR int*
typedef int* int_ptr;
INT_PTR a, b;
int_ptr c, d; 

A: a B: b C: c D: d

正确答案: ACD

INT_PTR a,b;  相当于   int* a,b;

* 一个星号只能声明一个变量为指针变量

3.以下程序段的输出结果是(  )

#include<stdio.h>
int main()
{
    char s[] = "\\123456\123456\t";
    printf("%d\n", strlen(s));
    return 0;
}

A: 12 B: 13 C: 16 D: 以上都不对

正确答案:A

知识点:\\ 表示字符'\',\123表示字符'{',\t表示制表符,这些都是一个字符

4.对于下面的说法,正确的是( )

A: 对于 struct X{short s;int i;char c;},sizeof(X)等于sizeof(s) + sizeof(i) + sizeof(c)
B: 对于某个double变量 a,可以使用 a == 0.0 来判断其是否为零
C: 初始化方式 char a[14] = "Hello, world!"; 和char a[14]; a = "Hello, world!";的效果相同
D: 以上说法都不对 

正确答案:D
A选项,没有考虑内存对齐。
B选项,考察double类型的比较,由于浮点数存在误差,不能直接判断两个数是否相等,通常采用比较两数之差的绝对值是否小于一个很小的数字(具体的可自己设定这样一个数,作为误差)来确定是否相等。
C选项,a为数组首地址是常量不能改变,所以A,B,C都是错的,选择D

5.下面代码段的输出是( )

int main()
{
    int a=3;
    printf("%d\n",(a+=a-=a*a));
    return 0;
}

A: -6   B: 0   C: 12   D:  -12

 正确答案:  D

6.若运行以下程序时,从键盘输入 ADescriptor<回车> ,则下面程序的运行结果是( )

#include <stdio.h>
int main()
{
char c;
int v0=0,v1=0,v2=0;
do
{
    switch(c=getchar())
    {
        case'a':case'A':
        case'e':case'E':
        case'i':case'I':
        case'o':case'O':
        case'u':case'U':v1 += 1;
        default:v0+= 1;v2+=1;
    }
}while(c!='\n');
printf("v0=%d,v1=%d,v2=%d\n",v0,v1,v2);
return 0;
}

A: v0=7,v1=4,v2=7

B: v0=8,v1=4,V2=8

C: v0=11,v1=4,v2=11

D: v0=12,v1=4,v2=12

正确答案:D

解析:当遇见a e i o u A E I O U 时v1 v2 v0全都自增1, 其他则是 v2 v0 自增1

易错注意!  switch语句中case里 没有break的话,执行当前语句会跳转到下一条,

(也会跳到default)

7.执行下面的程序段,语句3的执行次数为( )
 

for(i = 0; i <= n-1; i++) // (1)
    for(j = n; j > i; j--) // (2)
        state; // (3)

A: n(n+2)/2

B: (n-1)(n+2)/2

C: n(n+1)/2

D: (n-1)(n+2)

 正确答案:C

8.对于代码段,下面描述正确的是( )
 

t=0;
while(printf("*"))
{
    t++;
    if (t<3)
    break;
}

A: 其中循环控制表达式与0等价

B: 其中循环控制表达式与'0'等价
C: 其中循环控制表达式是不合法的

D: 以上说法都不对

正确答案:B
因print(“*”)函数调用的返回值是字符串中字符的个数,即为1。所以while后面的条件恒为真,所以循环控制表达式与'0'是等价的(字符'0'不是0),非零即为真

9.我们知道C语言的 break 语句只能跳出离它最近的一层循环,可是有时候我们需要跳出多层循环,下列跳出多层循环的做法正确的是【多选】( )

A: 将程序写成函数用return结束函数,便可跳出循环
B: 修改外层循环条件例如

for( int i = 0 ; i < MAX1 ; i ++ )
{
    for( int j = 0 ; j < MAX2 ; j ++ )
    {
        if( condition )
        {
            i = MAX1;
            break;
        }
    }
}

C: 在外层循环设置判断条件例如

for( ; symbol != 1 && condition2 ; )
{
    for( ; symbol != 1 && condition3 ; )
    {
        if( condition1 )
        symbol = 1;
    }
}

D: 在外层循环后面加入break例如

for( ; condition2 ; )
{
    for( ; condition3 ; )
    {
        if( condition1 )
        symbol = 1 ;
    } 
    if(symbol == 1 )
        break ;
}

正确答案:ABCD
此题旨在整理跳出多层循环的方法,每个选项都是正确的,代码为伪代码,condition代表逻辑表达式

10.在C语言中,一个函数不写返回值类型,默认的返回类型是 (  )

A: int 

B: char

C: void

D: 都不是

 正确答案: A

11.在上下文及头文件均正常的情况下,下列代码的输出是( )(注: print 已经声明过)
 

int main()
{
    char str[] = "Geneius";
    print(str);
    return 0;
}
print(char *s)
{
    if(*s)
    {
        print(++s);
        printf("%c", *s);
    }
}

A: suiene

B: neius

C: run-time error

D: suieneG

 正确答案: A
代码实现了递归倒序打印字符串的功能,但是++s使得s的值发生了变化,回不到'G'的位置上,故而没有打印'G'

12. 以下程序运行后的输出结果是( )
 

int main()
{
    int a=1,b=2,m=0,n=0,k;
    k=(n=b<a)&&(m=a);
    printf("%d,%d\n",k,m);
    return 0;
}

A: 0,0 

B: 0,1 

C: 1,0 

D: 1,1

 正确答案:A
注意:逻辑短路,||  &&  当左边的值能确定整个语句是真还是假的时候,后面的不再执行,直接返回真(或假)

13.下面函数的输出结果是( )
 

void func()
{
    int k = 1^(1 << 31 >> 31);
    printf("%d\n", k);
}

A: 0   B: -1   C: -2   D: 1

正确答案: C

注意:变成负数后,需要考虑 [补码变原码],(原来的正数原反补三码相同,不用考虑)

先计算的1<<31
左移31位,并在右侧填充0,得到0x80000000,即符号位为1,注意变成负数是得从补码变成原码输出(正数也要变原码,不过正数原反补相同),其他为0
然后便计算>>31
注意,这里在右移的时候,符号位保持为1,右移后填充1,结果为0xFFFFFFFF,即-1
0x00000001^0xFFFFFFFF,即0xFFFFFFFE(补码变原码)(-2)

14.请阅读以下程序,其运行结果是( )
 

int main()
{
    char c='A';
    if('0'<=c<='9') printf("YES");
    else printf("NO");
    return 0;
}

A: YES

B: NO

C: YESNO

D: 语句错误

正确答案: A

15.下面有关空指针和未初始化指针,说法错误的是( )

A: 对0x0这个地址取值是非法的
B: 空指针可以确保不指向任何对象或函数; 而未初始化指针则可能指向任何地方
C: 空指针与任何对象或函数的指针值都不相等
D: malloc在其内存分配失败时返回的是一个未初始化的指针

正确答案: D

malloc在其内存分配失败时返回的是NULL

16.以下选项中,对基本类型相同的两个指针变量不能进行运算的运算符是( )

A: +

B: -

C: =

D: ==

正确答案: A

1. 指针与指针之间不能加, 只能  指针 + 值    表示当前指针往后多少个元素类型

2. 指针减指针 返回的值是 两指针之间的元素个数

3. 相同类型的指针之间可以相互赋值

4. 可以判断指针之间的是否相等(多用于判断指针是否等于NULL)

17. 若有float a[3]={1.5,2.5,3.5},*pa=a;*(pa++)*=3; ”,则 *pa 的值是( )

A: 1.5

B: 2.5

C: 3.5

D: 4.5

正确答案: B

18.有以下函数,该函数的功能是( )

int fun(char *s)
{
    char *t = s;
    while(*t++);
    return(t-s);
}

A: 比较两个字符的大小

B: 计算s所指字符串占用内存字节的个数
C: 计算s所指字符串的长度

D: 将s所指字符串复制到字符串t中

正确答案: B

while()循环里  除了'\0',其他都为真

到了指针指向了'\0'时,跳出循环

此时指向'\0'的指针 减去 指向首字符的地址

(两指针相减返回之间的元素个数,但不包括'\0',如下图)

19. 以下程序运行后的输出结果是( )

#include <stdio.h>
int main()
{
    int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, *p = a + 5, *q = NULL;
    *q = *(p+5);
    printf("%d %d\n", *p, *q);
    return 0;
}

A: 运行后报错

B: 6 6

C: 6 11

D: 5 10

正确答案:A

这道题是个大坑...
指针q初始化为NULL,接着又解引用指针q,是错误的,对NULL指针是不能解引用的。

20. 以下叙述中正确的是( )

A: 即使不进行强制类型转换,在进行指针赋值运算时,指针变量的基类型也可以不同
B: 如果企图通过一个空指针来访问一个存储单元,将会得到一个出错信息
C: 设变量p是一个指针变量,则语句p=0;是非法的,应该使用p=NULL;
D: 指针变量之间不能用关系运算符进行比较

正确答案:B
A 选项描述不正确,不同类型指针一般不可以直接赋值;
C选项中,p=NULL;和p=0;是等价的;
D选项中,指向同一数组的两指针变量进行关系运算可表示它们所指数组元素之间的位置关系。B选项正确 

学习后的娱乐,非常的充实~

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值