**仅自用**,适用于大一新生,pat选择题易错点总结:

1. 执行以下程序段后,k的值为4?

int k = 3;
sizeof(++k);

 false

sizeof 不能里面进行运算

2. 实型数据可以进行求余数运算%。

false

只能是整型数据

3. 运行包含以下代码段的程序将可能进入死循环。

int i = 1;

while(i>0)

{ i++;

printf("%d ",i); }

false

数据的溢出现象

0->正数->负数->0

4.假设有变量定义语句float f = 1234567890123.123456;,打印语句printf("f = %f", f); 的输出是f = 1234567954432.000000 。那么可以这样解释这种想象:因为float类型的数据精度是十进制7~8位,第9位以后的数据是随机的,即下次再输出这个数时,第9位以后的数据可能会不一样。

false

float只有六位有效数字,且每次输出的数据不会变

5."a"是合法的字符常量。

false

"a"为字符串,‘a’为字符字符常量

6.以下标识符中,不合法的是( )。

A.my4a

B._4a

C.m_a

D.4a

D

数字不可以放第一位

但下划线可以哦!

7.以下选项中,合法的C语言常量是( )。

A.9,123,456

B.'\029'

C.0x28

D.2E3.5

C

不要忘记十六进制

8.在嵌套使用if语句时,C语言规定else总是?

A.和之前与其具有相同缩进位置的if配对

B.和之前与其最近的if配对

C.和之前与其最近的且不带else的if配对

D.和之前的第一个if配对

C

9.

double f = 2.5e5;

printf ("f=%5.4lf\n", f);

The output will be f=250000.0000

true

整数部分怎么可能被数字限制住呢

10.表达式 (3<x<5) 的值恒为1。

true

双目运算符(除了赋值运算符)结合方向都是从左至右

11.下面这段代码,打印输出的结果是3333

#include <stdio.h>
int main(){
    int a,b;
    a = 0123;
    b = 3210;
    printf("%d", a+b);
    return 0;
}

false

不要忘记八进制的表达,没错,a是一个八进制数

12.任何表达式语句都是表达式加分号组成的。

true

记住就好了,没什么好说的

13.表达式(a^a)的值恒为0。

true

这是“异或”运算,不懂就去查这个知识点吧,以后还会有这类题的

14.判断整型变量a是否是偶数的表达式为a%2=0。

false

注意这个等号有没有什么问题,没错,只有一个等号

15.假设有float f=7;则f%2的值为1。

false

取余运算符%怎么可以有浮点数

16.二维数组定义的一般形式如下,其中的类型名指定数组名的类型。 类型名 数组名[行长度][列长度];

false

行长度改为行数,列长度改为列数,他们有什么区别,自行体会.

17.设有定义语句:int a[ ][3]={{0},{1},{2}}; 则数组元素 a[1][2]的值是*NULL*

虽然书上说默认值是0,但这题答案为NULL,其实也就是0的意思,就是换了一种表示方法

18.在代码中,对于某个自己设计的函数,那么该函数声明、函数调用、函数定义(亦称函数的实现)三者在代码中的先后位置关系通常为:“函数声明”先于“函数调用”,“函数调用”先于 “函数定义”。

true

19.语句是 C 语言程序的基本结构模块。

false

基本结构模块是函数

20.按照C语言的规定,在参数传递过程中,既可以将实参的值传递给形参,也可以将形参的值传递给实参,这种参数传递是双向的。

flase

参数传递是单向的

21.以下函数值的类型是 ( )。

fun ( float  x )
{   float   y;  y= 3*x-4;  return  y;  }

A.int

B.不确定

C.void

D.float

A

默认是int类型

22.一个函数的返回值类型是()决定的。

A.return语句中表达式类型

B.定义函数时所指定的函数类型

C.调用该函数的主调函数的类型

D.在调用时临时指定的类型

B

加这题的原因是我错了,加个备忘录

23.if-else语句的一般形式如下,其中的语句1、语句2只能是一条语句。

if (表达式) 
    语句1
else 
    语句2  

true

没得大括号,你还想写多少条语句?

24.如果变量已经正确定义,则执行以下程序段后,x的值不变。

x = 4; 
if (x < 0){ 
    y = -1;
}else if (x = 0){
    y = 0;
}else{ 
    y = 1;
}  

false

第一次写我也错了,仔细看过之后才发现,第二个括号里的表达式是在赋值。。。

25.判断字符串a和b是否相等的表达式为if (a==b)。

flase

字符串不能直接比较,记得strcmp函数

26.有以下程序,执行后输出结果是()。

#include<stdio.h>
void f(int v , int  w)
{  int t;
   t=v;v=w;w=t;
}
int main( )
{
    int x=1,y=3,z=2;
    if(x>y)
      f(x,y);
    else if(y>z)
      f(y,z);
    else
      f(x,z);
    printf("%d,%d,%d",x,y,z);
    return 0;
}

A.1,2,3

B.3,1,2

C.1,3,2

D.2,3,1

C

f函数和主函数没有任何关联(只有值的传递,并不会改变实参的值)

27.阅读以下两段代码:

1

    int i;
    for(i=0; i<100; i++){
        /**
         此处省略代码若干行
         **/
    }

2

    int i=0;
    while(i<100){
        /**
         此处省略代码若干行
         **/
        i++;
    }

第一段用for语句实现的循环,一定等价于第二段用while语句实现的循环(两个循环中省略的代码相同)。

false

当存在continue时,两者就不相等了

28.语句for(i=1,j=10;i<j;++i, j--);执行之后i,j的值均为5。

false

万恶的前加加和后减减,具体区别自行百度

29.语句填空:下列 for循环语句将输出: 0 1 2 0 1 2 0 1 2

for( i=1; i<=9; i++ ) printf("%2d", ----);

(i - 1) % 3

30.空语句不是一条合法的语句,因为它没有作用。

false

31.对于定义 char str[] = "abc\000def\n"(注:其中0为数字零),求字符串str的长度len和数组str的大小size,len和size分别是:

A.12 ,13

B.3 ,11

C.3 ,9

D.3 ,4

C

**\000**这里面无论多少个0都视为**\0**

32.以下说法正确的是:

A.一个C语言源文件(.c文件)必须包含main函数

B.一个C语言源文件(.c文件)可以包含两个以上main函数

C.C语言头文件(.h文件)和源文件(.c文件)都可以进行编译

D.在一个可以正确执行的C语言程序中,一个C语言函数的声明(原型)可以出现任意多次

D

大家还有什么难题可以分享在评论区


补:

33.对于结构数组s,既可以引用数组的元素s[i],也可以引用s[i]中的结构成员。

true

34.结构体类型不可以嵌套定义。

false

其他函数不可嵌套定义,但结构体类型可以,典型代表为链表

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

struct stu{
  int x; 
  int *y;
} *p;
int dt[4] = {10, 20, 30, 40};
struct stu a[4] = {50, &dt[0], 60, &dt[1], 70, &dt[2], 80, &dt[3]};

int main( )
{ 
   p=a;
   printf("%d,", ++p->x);
   printf("%d,", (++p)->x);
   printf("%d", ++(*p->y));

   return 0;
}

A.10,20,20

B.50,60,21

C.51,60,21

D.60,70,31

C

指向结构体成员运算符->优先级高于自增运算符++

36.执行以下程序段,输入10,输出10.00

double x; 
scanf("%d", &x);  
printf("%.2f", x);   

false

数据类型不匹配,输出结果为0.00

37.break语句只能用于循环语句中。

false

break可用于循环体和switch结构,而continue只能用于循环体

具体请见此文章break和continue的区别

38.寄存器类变量的作用域和寿命与自动类变量的相同。

true

补充:自动类变量:函数中的形参和在函数中定义的局部变量

39.以下程序是某个C语言源文件的内容:

extern int k;
int main(){
    k = 3;
    return 0;
}

若某个C语言的工程(Project)仅包含这个源文件,则这个源文件可以通过编译,但工程无法成功链接、运行。

true

extern表示声明外部变量

40.有一段程序如下:

int getSum(int k){
    int s;
    s = getSum(k+1) + k;
    return s;
}
int main(){
    int sum;
    sum = getSum(0);
    return 0;
}

递归函数getSum设计不合理,这段程序将无限递归,始终不能结束。

false

当栈溢出后递归会停止

41.C语言中,通过函数调用只能获得一个返回值。

false

返回结构体时可以获得多个返回值。

42.在代码中,对于某个自己设计的函数,那么该函数声明、函数调用、函数定义(亦称函数的实现)三者在代码中的先后位置关系通常为:“函数声明”先于“函数调用”,“函数调用”先于 “函数定义”。

true

43.以下叙述是错误的。
局部变量可以和全局变量同名,在编译的时候不会出现错误,一旦不小心,可能导致使用错误变量,所以定义局部变量的时候不要和全局变量重名。

false

44.以数组名作函数参数时,实参数组与形参数组都不必定义长度,因为实参与形参的结合方式是地址结合,与数组长度无关。

true

45.不用递归就不能实现二叉树的前序遍历。

false

这怎么可能

46.数组名就是一个指针常量,指向数组的首元素(或者说代表了数组的首地址)。

false

数组名就是数组的首地址,没有代表一说

47.调用strcmp函数比较字符串大小时,通常较长的字符串会较大。

false

字符串大小与字符串长度没有必然联系

48.对二维数组初始化时,经常采用如下分行赋初值的方式,即在定义数组时,把初值表k中的数据依次赋给第k行的元素。

类型名 数组名[行长度][列长度] = {{初值表0},… {初值表k},……};

true

虽然刚开始我也认为应该是第k+1行,但行数是从0开始的

49.char s[80],*p=s; p="hello";这样赋值是可以的。

true

这是将字符串”fello“的地址赋给p,不是在对s复赋值

50.下面哪个表达式的值是2。

A.6%3

B.-5%3

C.5%-3

D.-5%-3

C

求模运算的结果的符号取决于第一个数的符号

51.下列程序段输出结果为 ____。

    int x = -3, y = 2;
    if(x>y);
    x = -x;
    if(x<y)
    y = -y;
    printf("x=%d,y=%d\n", x, y);

A.x=3,y=-2

B.x=3,y=2

C.x=-3,y=2

D.x=-3,y=-2

B

强调细节

注意第一个if后面的;

52.请读程序:

#include<stdio.h>

void 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

进行case 1,后还会进行case 2

54.若有int x=1;,执行下列程序段后,变量x的正确结果是:

switch (x*10) { 
    case 9: x+=1; break; 
    case 10: x+=1; 
    case 11: x+=1; 
    default: x+=1; 
}

A.1

B.2

C.3

D.4

D

没有break,switch语句不会停止,而是继续进行下去

55.对于以下递归函数,调用f(2, '1', '2', '3')的输出结果是( )。

void f(int n, char a, char b, char c)
{  
    if (n == 1){
       printf("%c->%c#", a, b) ;
    }else{
        f(n-1, a, c, b);
        printf("%c->%c#", a, b);
        f(n-1, c, b, a);
    }
}

A.1->2#1->3#3->2#

B.3->2#1->2#1->3#

C.'1'->'3'#'3'->'2'#'1'->'2'#

D.1->3#1->2#3->2#

D

注意:每次调用函数a,b,c的位置都有变换

56.下面叙述中错误的是( )。

A.C语言程序是由函数组成的

B.C语言的函数就是一段程序

C.C语言的函数可以直接使用,无须事先定义或声明

D.C语言的函数可以单独编译

C

57.有以下程序:

#include <stdio. h>

int fun(int x[], int n)
{
    static int sum=0;
    int i;
    for(i=0; i<n; i++) sum+ =x[i];

    return sum;
}

int main()
{
    int a[]={1,2,3,4,5},b[]={6,7,8,9},s=0;

    s=fun(a, 5)+fun(b, 4);
    printf("%d\n", s);

    return 0;
}

程序执行后的输出结果是( )。

A.45

B.50

C.60

D.55

C

sum是一个静态变量,每次执行完后不会被释放(重新赋值)

fun( a, 5)的结果为15,fun( b, 4)的结果为45

58.关于C语言以下说法正确的是( )

A.实参和与其对应的形参各占用独立的存储单元

B.实参和与其对应的形参共占用一个存储单元

C.只有当实参和与其对应的形参同名时才共占用存储单元

D.形参是虚拟的,不占用存储单元

A

纯理论题

59.以下说法正确的是( )

A.定义函数时,形参的类型说明可以放在函数体内,也可以放在函数体外

B.return后边的值不能为表达式

C.如果函数值的类型与返回值类型不一致,以函数值类型为准

D.如果形参与实参的类型不一致,以实参类型为准

C

纯理论题

60.若有语句“int a[3][4]={{1,3,5,7},{2,4,6,8}};”,则 *(*a+1) 的值为( ) 。

A.1

B.2

C.3

D.4

C

a表示的是第0行第0列的元素的地址,*a具体来说是*(a+0)即a[0]的意思,此时*a指向行,*a+1表示第0行第1个元素的地址,*(*a+1)就是a[0[1]的意思

具体知识讲解请见唐浩强《C程序设计(第五版)》第244页

61.若有语句“int n; cin>>n;”,则申请和释放长度为n的动态数组的语句正确的是( ) 。

A.int *p=new int (n); delete p;

B.int *p=new int (n); delete [] p;

C.int *p=new int [n]; delete p;

D.int *p=new int [n]; delete [] p;

D

62.若有语句int a[3][4], *p=&a[0][0]; 则与*(*(a+1)+2)等价的是 ( )。

A.*(*(p+1)+2)

B.a[1][2]

C.p[1][2]

D.*(p+1)+2

B

(*p)[]与*p的区别

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐