关于C语言部分错题

Posted 刚见面就脸红

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于C语言部分错题相关的知识,希望对你有一定的参考价值。

C语言

1.

这里只看那个或就行了,因为对于“或”而言一对全都对,所以只看“或”。

2.

3.C语言的数值常量中不能夹带空格。

4.C语言中的变量都必须先定义再使用,对变量的定义通常放在函数体内的前部,但也可以放在函数外部或复合语句的开头,不能随便放置。

5.在C语言中运算符两侧的运算数据类型可以不一致,且结果与精度较高的保持一致。

6.变量类型符double后面不能有逗号。

7. C语言中的非执行语句不会被编译,不会生成二进制的机器指令。

8. 由C语言构成的指令序列称作为C源程序,C源程序经过C语言编译程序编译之后生成一个后缀为.OBJ的二进制文件(称为目标文件);最后要由“连接程序”把此.OBJ文件与C语言提供的各种库函数连接起来生成一个后缀为.EXE的可执行文件。

9. C语言中八进制整型常量的开头是数字0,十六进制整型常量的开头数字是0x。C语言中的实型常量有两种表示形式:小数形式和指数形式。小数形式表示的实型常量必须要有小数点;指数形式,以“e”或“E”后跟一个整数来表示以10为底数的幂数,且规定字母e或E之前必须要有数字。

028错误,因为八进制中没有数字8;

4e1.5中e后面的指数不是整数,也不对;

10,000数字中不能有逗号。

10. C语言中标识符由字母、下划线、数字组成,且开头必须是字母或者下划线。另外,关键字不能作为标识符。因为C语言中区分大小写,所以“FOR”可以作为标识符来用。&a不对,因为这个字符中含有&,这是一个非法字符。

11. 设有定义:char s[81];int i=0;,以下不能将一行(不超过80个字符)带有空格的字符串正确读入的语句或语句组是 scanf(“%s”,s);

因为字符串的输入不能使用scanf(“%s”,s);而应该使用gets(s).

gets(s)函数与scanf("%s",s)相似,但不完全相同,使用scanf("%s" ,s)函数输入字符串时,输入了空格则认为输入字符串结束,空格后的字符将作为下一个输入项处理。但gets()函数将接收输入的整个字符串直到遇到回车为止。Getchar()的功能是从缓冲区中取出一个字符,所以通过它就可以将回车符取出来。

12. C源程序中不能表示的数制是(二进制),在C语言中整型常量可以用十进制、八进制和十六进制等形式表示,但是不包括二进制。

13. ++k是先使得k的值自增1后再使用,k++是先取得k的值再将k的值自增1。

14. 字符只能用英文的单引号不能用双引号。

15. 算数运算符左边只能是单个变量。

16. 强制类型转换必须要在int两边打上括号。

17. 整型数在机器中就是用补码表示的

18. 一个C语言程序可以实现多种算法。一个C程序可以由一个或多个源程序文件组成,一个源程序文件由一个或多个函数组成,构成C语言程序的基本单位是函数,函数也是C程序中模块化程序设计的基础,C函数可分为标准库函数和用户定义函数两类。

19. 若有定义 int a,b, c;以下选项中的赋值语句正确的是( )。

A.a=(b=c)+1;

B.(a=b)=c=l;

C.a=(b==c)=1;

D.a+b=c;

本题考查的是赋值语句。赋值语句的左侧只能是变量,故B、D错;"="是赋值号,"=="不是赋值号,故C错误。故本题答案为A。

20.sizeof (double)是_B___。

A.一个双精度型表达式

B.一个整型表达式

C.一个不合法的表达式

D.一种函数调用

sizeof返回对象或者类型所占的内存字节数,因此是整型表达式。故本题的答案为B。

21. 以下关于指针的说法错误的是__D______。

A.通过加一个正整数,可以使指针指向其他内存单元

B.可以向指针所指内存单元中写入类型与指针基类型相同的数据

C.指针可以指向与其基类型相同的普通变量

D.可以向指针中写入任意数据

指针变量必须区分基类型,基类型不同的指针变量不能够混合使用。

22. 以下叙述中正确的是_______。

A. 局部变量说明为static存储类,其生存期将得到延长

B. 全局变量说明为static存储类,其作用域将被扩大

C. 任何存储类的变量在未赋初值时,其值都是不确定的

D. 形参可以使用的存储类说明符与局部变量完全相同

此题考的是变量的作用域。在一个函数内部定义的变量是局部变量,它只在本函数范围内有效,而全局变量的作用域为整个源程序文件,即它可以为本文件中所有函数所共用,static类型的变量是静态变量,它的值在函数调用结束后不会消失,而是保留原值,即占用存储单元不释放,由于全局变量的存储方式也是如此,即全局变量和说明为static类型的变量的作用域是相同的,所以B答案这句话是错误的,A答案是正确的;C答案也是错误的,因为对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符型变量),而对自动变量来说,如果不成初值则它的值是一个不确定的值,这是因为每次函数调用结束后存储单元已释放,下次调用时又重新另分配存储单元,而所分配的单元中的值是不确定的。[回车]故本题答案为A。

23. 若有定义语句: char s[10]=”1234567\\0\\0”;,则strlen(s)的值是____。

A.7

B.8

C.9

D.10

本题的考查点是字符串长度函数。 strlen (字符数组)是测试字符串的长度的函数。函数的值为字符串的实际长度,不包括'\\0'在内.C语言中字符串是以'\\0'字符结束的,且strlen()函数计算的是'\\0'字符前的所有字符的个数,所以本题strlen(s)的值是7。需要与其区分的是sizeof()函数,它的功能是计算变量或数组的所分配到的内存空间的大小。如果本题要求计算sizeof(s)的话,则其值应为10。故本题答案为A

24. 在调用函数时,如果实参是简单变量,它与对应形参之间的数据传递方式是______。注意这里是实参不是形参。C语言函数中的参数传递方式是按值传递,指将实参的值复制一份传递给形参,形参的改变而不影响实参,即为单向传递。

18.

CPU进程的状态

就绪状态

运行状态

等待状态

转换条件

一旦分配到CPU,就转为运行状态。

当需要等待某个事件发生才能继续运行时,则转为等待状态(阻塞状态) ;或者由于分配给它的时间片用完,就让出CPU而转为就绪状。

如果它等待的事件已经发生,即条件得到满足,就转为就绪状态。

C语言

1.

这里只看那个或就行了,因为对于“或”而言一对全都对,所以只看“或”。

2.

3.C语言的数值常量中不能夹带空格。

4.C语言中的变量都必须先定义再使用,对变量的定义通常放在函数体内的前部,但也可以放在函数外部或复合语句的开头,不能随便放置。

5.在C语言中运算符两侧的运算数据类型可以不一致,且结果与精度较高的保持一致。

6.变量类型符double后面不能有逗号。

7. C语言中的非执行语句不会被编译,不会生成二进制的机器指令。

8. 由C语言构成的指令序列称作为C源程序,C源程序经过C语言编译程序编译之后生成一个后缀为.OBJ的二进制文件(称为目标文件);最后要由“连接程序”把此.OBJ文件与C语言提供的各种库函数连接起来生成一个后缀为.EXE的可执行文件。

9. C语言中八进制整型常量的开头是数字0,十六进制整型常量的开头数字是0x。C语言中的实型常量有两种表示形式:小数形式和指数形式。小数形式表示的实型常量必须要有小数点;指数形式,以“e”或“E”后跟一个整数来表示以10为底数的幂数,且规定字母e或E之前必须要有数字。

028错误,因为八进制中没有数字8;

4e1.5中e后面的指数不是整数,也不对;

10,000数字中不能有逗号。

10. C语言中标识符由字母、下划线、数字组成,且开头必须是字母或者下划线。另外,关键字不能作为标识符。因为C语言中区分大小写,所以“FOR”可以作为标识符来用。&a不对,因为这个字符中含有&,这是一个非法字符。

11. 设有定义:char s[81];int i=0;,以下不能将一行(不超过80个字符)带有空格的字符串正确读入的语句或语句组是 scanf(“%s”,s);

因为字符串的输入不能使用scanf(“%s”,s);而应该使用gets(s).

gets(s)函数与scanf("%s",s)相似,但不完全相同,使用scanf("%s" ,s)函数输入字符串时,输入了空格则认为输入字符串结束,空格后的字符将作为下一个输入项处理。但gets()函数将接收输入的整个字符串直到遇到回车为止。Getchar()的功能是从缓冲区中取出一个字符,所以通过它就可以将回车符取出来。

12. C源程序中不能表示的数制是(二进制),在C语言中整型常量可以用十进制、八进制和十六进制等形式表示,但是不包括二进制。

13. ++k是先使得k的值自增1后再使用,k++是先取得k的值再将k的值自增1。

14. 字符只能用英文的单引号不能用双引号。

15. 算数运算符左边只能是单个变量。

16. 强制类型转换必须要在int两边打上括号。

17. 整型数在机器中就是用补码表示的

18. 一个C语言程序可以实现多种算法。一个C程序可以由一个或多个源程序文件组成,一个源程序文件由一个或多个函数组成,构成C语言程序的基本单位是函数,函数也是C程序中模块化程序设计的基础,C函数可分为标准库函数和用户定义函数两类。

19. 若有定义 int a,b, c;以下选项中的赋值语句正确的是( )。

A.a=(b=c)+1;

B.(a=b)=c=l;

C.a=(b==c)=1;

D.a+b=c;

本题考查的是赋值语句。赋值语句的左侧只能是变量,故B、D错;"="是赋值号,"=="不是赋值号,故C错误。故本题答案为A。

20.sizeof (double)是_B___。

A.一个双精度型表达式

B.一个整型表达式

C.一个不合法的表达式

D.一种函数调用

sizeof返回对象或者类型所占的内存字节数,因此是整型表达式。故本题的答案为B。

21. 以下关于指针的说法错误的是__D______。

A.通过加一个正整数,可以使指针指向其他内存单元

B.可以向指针所指内存单元中写入类型与指针基类型相同的数据

C.指针可以指向与其基类型相同的普通变量

D.可以向指针中写入任意数据

指针变量必须区分基类型,基类型不同的指针变量不能够混合使用。

22. 以下叙述中正确的是_______。

A. 局部变量说明为static存储类,其生存期将得到延长

B. 全局变量说明为static存储类,其作用域将被扩大

C. 任何存储类的变量在未赋初值时,其值都是不确定的

D. 形参可以使用的存储类说明符与局部变量完全相同

此题考的是变量的作用域。在一个函数内部定义的变量是局部变量,它只在本函数范围内有效,而全局变量的作用域为整个源程序文件,即它可以为本文件中所有函数所共用,static类型的变量是静态变量,它的值在函数调用结束后不会消失,而是保留原值,即占用存储单元不释放,由于全局变量的存储方式也是如此,即全局变量和说明为static类型的变量的作用域是相同的,所以B答案这句话是错误的,A答案是正确的;C答案也是错误的,因为对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符型变量),而对自动变量来说,如果不成初值则它的值是一个不确定的值,这是因为每次函数调用结束后存储单元已释放,下次调用时又重新另分配存储单元,而所分配的单元中的值是不确定的。[回车]故本题答案为A。

23. 若有定义语句: char s[10]=”1234567\\0\\0”;,则strlen(s)的值是____。

A.7

B.8

C.9

D.10

本题的考查点是字符串长度函数。 strlen (字符数组)是测试字符串的长度的函数。函数的值为字符串的实际长度,不包括'\\0'在内.C语言中字符串是以'\\0'字符结束的,且strlen()函数计算的是'\\0'字符前的所有字符的个数,所以本题strlen(s)的值是7。需要与其区分的是sizeof()函数,它的功能是计算变量或数组的所分配到的内存空间的大小。如果本题要求计算sizeof(s)的话,则其值应为10。故本题答案为A

24. 在调用函数时,如果实参是简单变量,它与对应形参之间的数据传递方式是______。注意这里是实参不是形参。C语言函数中的参数传递方式是按值传递,指将实参的值复制一份传递给形参,形参的改变而不影响实参,即为单向传递。

18.

CPU进程的状态

就绪状态

运行状态

等待状态

转换条件

一旦分配到CPU,就转为运行状态。

当需要等待某个事件发生才能继续运行时,则转为等待状态(阻塞状态) ;或者由于分配给它的时间片用完,就让出CPU而转为就绪状。

如果它等待的事件已经发生,即条件得到满足,就转为就绪状态。

C语言易错题 and 易混淆知识

1. 以下关于指针的说法,正确的是( )

A.int *const p与int const *p等价
B.const int *p与int *const p等价
C.const int *p与int const *p等价
D.int *p[10]与int (*p)[10]等价

A:错误,int* const p中,const修饰指针变量p本身,表示p的指向不能改变, int const *p中,const修饰p指针解引用之后的结果,表示p指向的内容不能改变 因此,不等价

B:错误,同上

C:正确,const都修饰p指针解引用之后的结果,表示p指向的内容不能改变

D:错误,int p[10]定义了一个指针数组,数组中10个元素,每个元素都是int类型的指针 int (*p)[10]定义了一个数组指针,该指针只能指向存储10个整形元素的数组

  
  
  
  
  

2. 由多个源文件组成的C程序,经过编辑、预处理、编译、链接等阶段会生成最终的可执行程序。下面哪个阶段可以发现被调用的函数未定义?( )

 A.预处理
 B.编译
 C.链接
 D.执行


  解析:预处理只会处理#开头的语句,编译阶段只校验语法,链接时才会去找实体,所以是链接时出错的,故选C。

预处理:相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有头文件(都已经被展开了)、宏定义(都已经替换了),没有条件编译指令(该屏蔽的都屏蔽掉了),没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。
  
编译:将预处理完的文件逐一进行一系列词法分析、语法分析、语义分析及优化后,产生相应的汇编代码文件。编译是针对单个文件编译的,只校验本文件的语法是否有问题,不负责寻找实体。
  
链接:通过链接器将一个个目标文件(或许还会有库文件)链接在一起生成一个完整的可执行程序。 链接程序的主要工作就是将有关的目标文件彼此相连接,也就是将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体。在此过程中会发现被调用的函数未被定义。需要注意的是,链接阶段只会链接调用了的函数/全局变量,如果存在一个不存在实体的声明(函数声明、全局变量的外部声明),但没有被调用,依然是可以正常编译执行的。

  
  
  
  
  

3. 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

提示:define 和 typedef

  
  
  
  
  

指针数组与数组指针

指针就是指针,数组就是数组。

快速判断:(通过操作符优先级)

int (*p)[10];

//解释:p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组。所以p是一个指针,指向一个数组,叫数组指针。

//这里要注意:[ ]的优先级要高于*号的。所以必须带上括号是其定义为指针类型。


指针数组

 指针数组是 数组;是存放数据元素为指针的数组。

int arr0[10];   //整型数组
char arr1[5];   //字符数组

int* arr2[4];   //指针数组

arr2 是一个数组,有五个元素,每个元素是一个整形指针。

数组指针

  数组指针是 指针;是指向数组地址的指针,即数组首元素地址。

int arr[6][7];   //arr为二维整型数组
int (*p) [7];   //p为数组指针

以上是关于关于C语言部分错题的主要内容,如果未能解决你的问题,请参考以下文章

C语言易错题 and 易混淆知识

C语言错题总结

C语言错题总结

C语言错题总结

C语言错题集2:分支与循环

C语言错题总结