大一上C语言复习2.选择题

本文涵盖了C语言的基础知识,包括程序结构、运算符优先级、移位运算、函数调用、变量定义、指针操作、结构体及数组的使用。深入探讨了程序执行流程,如递归函数的计算过程,并强调了内存管理和数据类型的细节,如整型除法、负数求余。同时,还涉及到了文件、内存和数组的存储原理,以及在编程实践中需要注意的细节问题。
摘要由CSDN通过智能技术生成

初识C

(1)程序与数据一样,共同存储在存储器中。当程序要运行时,当前准备运行的指令从内存被调入CPU中,由CPU处理这条指令。这种将程序与数据共同存储的思想就是目前绝大多数计算机采用的(A)模型的存储程序概念

A.冯•诺伊曼 B.阿兰•图灵 C.克劳德•香农 D.西蒙•克雷

(2)整型除法,得到的是整形,所以对于:

微信图片_20190929164109.png

 如果在C语言中先除9会带来较大误差

一般进行*1.0或加.0来转浮点型,或者加括号进行强转操作

(3)负数的取余操作:

求余定义:a%b = a - (a/b)*b
负数求余:被除数的绝对值与除数绝对值取余的值即为余数绝对值,余数符号与被除数一致。、
例:-10%3=-1;10%(-3)=1;

(4)注意题干选项中的输入输出格式和顺序

(5)运算符优先顺序记忆(结合性):

C++ 运算符优先级列表 - IAmAProgrammer - 博客园

(6)移位运算符:

C语言的移位运算符 - 厸清扬 - 博客园

C语言移位运算符 - mfrbuaa - 博客园

(7)哪一项与其他代码不等价

1>switch语句:break有无,default有无(有时没有也能等价,在语句外赋值)

                         在有break的情况下,与顺序无关

2>ifelse语句:注意赋值号与等号的区别

                        在嵌套使用if语句时,C语言规定else总是和之前与其最近的且不带else的if配对

int main(void)
{   
      int  a = 2, b = -1, c = 2;

      if(a < b)
            if(b < 0)  
                  c = 0;
      else  c++;
      printf("%d\n",c);    

      return 0;
}
1.else与 if(b < 0)  配对(与其最近的且不带else的if配对)一起成为if(a < b)内的判定形成嵌套调用,由于第一个if语句没有进入,c的值未被修改

2.如果第一个if语句后加上分号,c的值就会被改变

(8)对于变量定义:int a, b = 0;  定义了a赋一个随机值,定义变量b赋值0

(9)给结果逆推变量取值:

在执行以下程序时,为使输出结果为:t=4,则给a和b输入的值应满足的条件是  C 

int main(void)
{    
      int  a,b,s,t;

      scanf("%d,%d",&a,&b);
      s = 1; t = 1;
      if(a > 0) s = s + 1;
      if(a > b) t = s + t;
      else if(a == b) t = 5;
      else t = 2 * s;
      printf("t=%d\n",t);    

      return 0;
}

A.a>b      B.a<b<0    C.0<a<b     D.0>a>b

(10) break 语句只能用在循环体内和 switch 语句体内

函数

(11) 以下关于函数叙述中,错误的是(B)。

A.函数未被调用时,系统将不为形参分配内存单元

B.实参与形参的个数必须相等,且实参与形参的类型必须对应一致

可以进行类型强转

形参应与对应的实参类型一致??

C.当形参是变量时,实参可以是变量、常量或表达式

D.如函数调用时,实参与形参都为变量,则这两个变量不可能占用同一内存空间

(12)实参与其对应的形参各占用独立的存储单元

(13)在函数调用Func(exp1 , exp2+exp3 , exp4*exp5)中,实参的数量是 ()

           3个,表达式需要算出值后再代入函数,所以只有三个实参

(14)形参无法改变实参的数值,除非传到函数的是指针变量进行赋值

(15)以下程序的运行结果是( )。

int x = 5, y = 6;
void incxy( )
{   
    x++;
    y++;
}
int main(void )
{   
    int x = 3;

    incxy( );
    printf("%d, %d\n", x, y);

    return 0;
}

A.3, 6       B.4, 7       C.3, 7      D.6, 7

局部变量对全局变量的遮蔽作用:

类似排异反应,函数优先调用函数内部定义的参数,当全局变量名与局部变量名相同时,优先调用局部变量,所以改代码x的值并未发生改变,所以为3

递归(初阶过程理解)

(16)对于以下递归函数f,调用 f(3) 的返回值是( )。

 int f(int n)
 {
     if (n != 0){
        return f(n-1) + n;
     }else{
        return n;
     }
 }

1.首先  3  代入函数进行判定,执行 f(3-1) +   3语句

2.所以  2  代入函数进行判定,执行f(2-1)  +   2语句

3.接着  1  代入函数进行判定,执行f(1-1)  +   1语句

4.最后  0  代入函数进行判定,执行return 0语句

5.回到第三步,return 1

6.回到第二步,return 1 + 2

7.回到第一步,return 3 + 3

8.所以结果为   6

内存

(17)数组占内存为申请变量个数乘类型所占内存

二维数组

(18)可以省略列但不能省略行,即a[5][ ]可,但a[ ][5]不行

指针

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

# include <stdio.h> 
int main(void)
{
    int a[10] = {0,1,2,3,4,5,6,7,8,9}, *p = a+3;

    printf("%d", p[2]);

    return 0;
}

指针P可以类似定位一个新的数组起点,类似新建一个数组

*p = a+3后 p 指向的 a数组的第四个元素的地址为首地址,再导入数组下标进行访问

字符串

(20)scanf("%s", &pup[0].name)  错误  定义name本来就是地址,字符串首地址,无需取地址

结构体

(21)结构体定义,在没有typedef的情况下,类型名为sturct + 自定义名 + 自定义名

(22)设有如下定义,则对data中的a成员的正确引用是()。

struct sk{
   int a; 
   double b;
} data, *p = &data;

A.(*p).data.a     B.(*p).a     C.p->data.a     D.p.data.a

(*p) =  data是因为取了地址,而之前的判断题中无取地址符,所以对于结构体指针变量只能用箭头访问成员,只有定义的结构体变量名才用 . 进行访问

而数组可以用p[i]访问

(23)结构体数组

若有下列定义,则以下不合法的表达式是(D )

struct student{
   int num;
   int age;
};
struct student stu[3] = {{101, 20}, {102, 19}, {103, 20}}, *p = stu;

A.(p++)->num        B.p++        C.(*p).num        D.p = &stu.age

P指向的是结构体数组首个结构体的地址,所以解引用即为stu[0],可以通过.进行成员访问

而stu虽然代表结构体数组首个结构体地址,但需要下标才能进行合法访问

文件

(24)缓冲文件系统的文件缓冲区位于(内存数据区中)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值