当梦拓了,想 push 我的 xdx 们学 C 语言,遂有此文(不过大家好像也没好好学 QAQ )

C语言quiz(一)

by 西门蒸馍

考点

  • hello world
  • 变量命名
  • 赋值运算
  • 整数、浮点数
  • 输入输出
  • 五则运算
  • 自增自减运算
  • 判断
  • 分支语句
  • 循环

题目


    1. 想要实现打印 hello world 并换行,以下C语言程序中有几处错误

      ( )

      1
      2
      3
      4
      5
      6
      7
      include <stdio。h>

      int mian()
      {
      print("hello word/n");
      return o
      }

      A. 10处

    B. 9处

    C. 8处

    D. 7处

答案&解析

B【解析】

  • include 前没有 #
  • stdio 的文件后缀是中文句号
  • main 不是 mian
  • printf 不是 print
  • \n 不是 /n
  • world 错写为 word
  • printf 结尾的分号是中文分号
  • return 后面的是字母 o
  • return 结尾没有加分号

    1. 以下哪些可以作为C语言的变量名 [多选]

      ( )

    A. Beihang University

    B. LinShiE

    C. 237324Class

    D. _BUFFER&LEN_

    E. i_love_buaa

    F. int

    G. include

    H. _

答案&解析

BEGH【解析】

  • A:变量名不能有空格
    • C:变量名不能以数字开头
    • D:变量名里除了字母、数字、下划线意外不能有其他字符
    • F、G:int 是 C 语言的关键字,但 include 不是(include 是编译预处理指令)

    1. 以下程序的运行结果是什么

      ( )

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      #include <stdio.h>

      int main()
      {
      int a,b,c;
      b = 237324;
      a = 2023;
      b = ( a = c );
      printf("%d",b);
      }

    A. 237324

    B. 2023

    C. 无法确定

    D. 0

答案&解析

C【解析】

  • 赋值语句 a=c 本身是有值的,它的值等于 c
  • 但是 c 并没有初始化,编译器会依据 c 在内存中的位置(学名叫“地址”)的情况赋给它一个值,这个值我们并不清楚,不一定是 0
  • 要记住变量在使用前一定要初始化

    1. 以下说法中正确的有[多选]

      ( )

      A. double 用来定义双精度浮点数,float 用来定义单精度浮点数

      B. 浮点数与整数共同参与加减乘除运算时,整数会被自动视为浮点数参与运算

      C. printf("%f",1.0/0.0); 可以正常运行

      D. double a = 0.0;double a = 0; 都可以正常运行

答案&解析

ABCD【解析】

  • B、D:整数在与浮点数运算时、赋值给浮点类型的变量时,都会发生强制类型转化
  • C:由于浮点数表示不精确,所以进行浮点运算除以 0.0 时,会得到一个很大的浮点数,但是这并不影响它正常运行

    1. 以下输入输出的语句中符合规定的序号是

      ( )

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      // --------------------------
      (1) int a;
      scanf("%d", &a);
      // ---------------------------
      (2) float a;
      scanf("%f", a);
      // ---------------------------
      (3) double a;
      scanf("%f", &a);
      // ---------------------------
      (4) int a = 0;
      printf("%d", a);
      // ---------------------------
      (5) double a = 0.0;
      printf("%lf", a);
      // ---------------------------
      (6) double a = 0.0;
      printf("%f", a);
      // ---------------------------

      A. (1)(4)(5)(6)

      B. (1)(2)(3)(4)(5)

      C. (1)(4)(5)

      D. (1)(2)(3)(4)(5)(6)

答案&解析

A【解析】

  • 记住使用 scanf 输入数据时要加 & ,这个很重要(因为编译器不会报错)
  • 记住使用 printf 输出数据时不要加 & (除非你真的知道加 & 后会发生什么)
  • double 类型的数输入时是 %lf ,输出时是 %lf%f

    1. C语言中下面各式的计算结果为 1 或者浮点结果为 1.0 的是

      ( )

    A. 3 * 2 % 6

    B. 3 / 2 * 4 / 6

    C. 3.0/2 * 4 / 6

    D. 3.0/2 * 4 % 5

答案&解析

C【解析】

  • A:不要下意识以为 6%6 等于 1

  • B:整数除法会自动向下取整

  • D:浮点数不能进行取模运算


    1. int a = 0; 的前提下,以下说法正确的是

      ( )

      A. a = a++ 可以实现让 a 的值增加 1 的效果

      B. a++ = a 可以实现让 a 的值增加 1 的效果

      C. a = --a 可以实现让 a 的值减小 1 的效果

      D. a = ++1 可以实现让 a 的值变成 2 的效果

答案&解析

C【解析】

  • a++++a 的效果都是让 a1,但是 a++ 这个式子本身的值是 a++a 这个式子的值是 a 加完1 之后的值;a----a 同理
  • a++ 实际上等效于 a = a+1 (但是会快一丢丢),所以 a++ 这样的式子相当于一个赋值语句,不能充当左值 (左值就是赋值号左边的值),所以 选项B 会报错;同理,因为数字 1 不能当左值,所以 1++ 会报错,D选项 主要是想让大家理解 “变量” 和 “值”

【提前了解】
C语言中可用字母 e 表示浮点数的科学计数法。

例如,1e-6 表示 $1.0 \times 10^{-6}$ ;2.2e8 表示$2.2 \times 10^8$

    1. 下列说法中错误的为

      ( )

    A. printf("%d", ( 1==1 )); 的执行结果为 1

    B. 代码中出现 if( a = 1 ) 的语句会报错

    C. 若 int a,b,c 三个变量分别代表三角形的三条边,则(a+b>c)+(a+c>b)+(b+c>a) 的值一定为 3

    D. 判断浮点数 a 是否等于 0.0 ,在代码中应写为 if( fabs(a) < eps )

    (解释: (1) fabs(a) 表示 a 的绝对值 (2) eps 一般被定义为一个很小的浮点数,通常为 1e-61e-7

答案&解析

B【解析】

  • 这个题没什么要说的,就是提醒一下大家尽量不要犯把 == 写成 = 的错误(但也难免),不过为了防止出现上面的错误而半天 de 不出来 bug ,大家可以这样写 if( 1 == a ) 。因为这样写如果不小心少打了个 = 编译器会报错(具体原因参考上一题),不过这样会降低代码的可读性(别人看着别扭),希望大家在熟练了以后改成正常的判断写法。
  • 要记住本题告诉大家的 _判断浮点数是否等于某个值_ 的方法

    1. 下列程序的运行结果为____[填空题]

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      #include <stdio.h>

      int main()
      {
      int a = -1, b = 0, c = 1;
      if( ++a != b );
      printf("1");
      if( b = 0 )
      printf("2");
      c++;
      switch (c)
      {
      case 1:
      printf("3");
      break;
      case 2:
      printf("4");
      default:
      printf("5");
      break;
      }
      return 0;
      }
    答案&解析

    145【解析】

      • 没啥要说的,重要的是看代码第 6 行的 if 判断后有分号,所以第 7 行一定会执行
      • 还有就是记住 if 后面没有 {} 的话就只能管辖到下一个分号为止(排版没排好 ,其实为了给大家挖坑,printf("1");c++; 是想放到和第 9printf("2"); 同一列的,就像现在这样)
      • 记得 break 一定要写

    1. 为了实现 “求出某正整数有多少位” 的程序,while 的循环条件应该为

      ( )

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      #include <stdio.h>

      int main()
      {
      int a;
      int n = 0;
      scanf("%d",&a);
      while( __?__ ){
      n++;
      a /= 10;
      }
      printf("该正整数一共有%d位",n);
      return 0;
      }

      A. a == 1

      B. a == 0

      C. a != 1

      D. a != 0

答案&解析

D【解析】

  • 这个没啥,主要是想让大家练一练分析代码的能力(当然就这强度还远远不够)

大家根据自己的做题的实际情况为目前的预习做好自我评价,这些题目应当是大家不使用电脑敲代码就完全可以做出来的。不过,不管你对了几道题,都不要 气馁 or 骄傲,C 语言的学习之路才刚刚开始,查缺补漏是最关键的。现在对自己要求高一点也是为了让自己大一乃至以后的学习更加轻松。如果你看了答案解析还有不清楚的题目,欢迎来问我喵~