C语言基础知识复习

基本数据类型、常量与变量
基本数据类型
常量
变量
总结与易错点

基本数据类型

整型数据

C语言中的整型数据类型用于存储整数,包括:

  • char:1字节,存储字符或小整数(-128~127)
  • short int:2字节,短整型(-32768~32767)
  • int:4字节(32位系统),默认整数类型(-2147483648~2147483647)
  • long int:4或8字节,长整型
  • long long int:8字节,更长的整型(C99标准新增)

整型常量可以用十进制、八进制(以0开头)和十六进制(以0x或0X开头)表示。

示例:

int decimal = 100; // 十进制
int octal = 0144; // 八进制,等于十进制的100
int hexadecimal = 0x64; // 十六进制,等于十进制的100

浮点型数据

浮点型用于存储小数或科学计数法表示的数字:

  • float:4字节,单精度浮点型(6-7位有效数字)
  • double:8字节,双精度浮点型(15-16位有效数字)
  • long double:8或12字节,更高精度的浮点型

浮点型常量可以用小数形式(3.14)或指数形式(1.2e3)表示。

示例:

float pi = 3.14f; // 单精度浮点数
double distance = 1.5e11; // 科学计数法,表示1.5×10¹¹
long double precise = 3.1415926535L; // 长双精度浮点数

字符型数据

字符型用于存储单个字符:

  • char:1字节,存储ASCII字符(-128~127)

字符常量用单引号括起来('A'),字符串用双引号括起来("ABC")。C语言没有专门的字符串类型,而是使用字符数组存储字符串。

示例:

char grade = 'A';
char newline = '\n'; // 转义字符,表示换行
char message[] = "Hello"; // 字符数组存储字符串

整型数据类型练习题

1. 以下哪个选项正确定义了一个长整型变量并初始化?
正确答案:B

解析:长整型变量应使用long intlong声明,初始化值后加L后缀表示长整型常量。

2. 以下代码的输出是什么?
#include <stdio.h>
int main() {
  short a = 32767;
  printf("%d", a + 1);
  return 0;
}
正确答案:B

解析:short类型范围是-32768~32767。32767+1超出了最大值,发生溢出,结果为-32768。

3. 以下哪个是有效的八进制整型常量?
正确答案:C

解析:八进制数以0开头,只能包含0-7的数字。A选项包含8,无效;B是十六进制;D是十进制。

4. 以下代码的输出是什么?
#include <stdio.h>
int main() {
  int a = 10;
  int b = 3;
  float c = a / b;
  printf("%.2f", c);
  return 0;
}
正确答案:B

解析:整数除法a/b结果是3(整数),然后赋值给float变量c,所以是3.00。

5. 以下哪个是有效的字符常量?
正确答案:C

解析:字符常量用单引号括起来,只能包含一个字符。A是字符串;B包含两个字符;D缺少引号。C是八进制转义字符,表示'A'。

常量

常量的概念与分类

常量是在程序运行过程中值不能改变的量:

  • 字面常量:直接使用的数值,如10、3.14、'A'
  • 符号常量:使用#define定义的常量,如#define PI 3.14159
  • 整型常量:如100、0123(八进制)、0x1A(十六进制)
  • 浮点型常量:如3.14、1.2e3
  • 字符常量:如'A'、'\n'(转义字符)
  • 字符串常量:如"Hello World"

字符串常量以'\0'结尾,所以字符数组长度要比实际字符数多1。

示例:

#define MAX_SIZE 100 // 符号常量
#define PI 3.14159

int main() {
  int count = 10; // 10是字面常量
  char letter = 'B'; // 'B'是字符常量
  char name[] = "Tom"; // "Tom"是字符串常量(实际存储'T','o','m','\0')
  // ...
}

const关键字

使用const关键字可以定义只读变量(常量):

const int MAX = 100; // MAX是只读的整型常量
const float PI = 3.14159; // PI是只读的浮点型常量

const常量在定义时必须初始化,之后不能再修改它的值。

常量练习题

1. 以下定义符号常量的方式哪个是正确的?
正确答案:C

解析:#define指令定义符号常量时不需要等号和分号,格式为#define 常量名 值。

2. 以下选项中可作为C语言合法常量的是?
正确答案:A

解析:B选项-080是八进制,但八进制不能出现8;C选项-8e1.0的指数部分不能为小数;D选项-80.0e缺少指数部分。

3. 以下哪种方式可以正确存储字符串"Hello"?
正确答案:B

解析:字符串"Hello"需要6个字符空间(5个字符+1个结束符'\0')。A选项空间不足;C选项缺少结束符;D选项空间不足。

4. 以下关于const关键字的说法,错误的是?
正确答案:C

解析:尝试通过指针修改const变量是未定义行为,可能导致程序崩溃或不可预测的结果。

5. 以下代码的输出是什么?
#include <stdio.h>
#define PI 3.14
int main() {
  const double pi = 3.1415926;
  printf("%.2f %.4f", PI, pi);
  return 0;
}
正确答案:A

解析:符号常量PI值为3.14,const常量pi值为3.1415926,%.2f输出3.14,%.4f输出3.1416(四舍五入)。

变量

变量的定义与使用

变量是程序运行期间值可以改变的量:

  • 定义格式:数据类型 变量名; 如:int count;
  • 命名规则:由字母、数字、下划线组成,且第一个字符必须是字母或下划线
  • 重要规则:C语言区分大小写,必须先定义后使用
  • 初始化:定义变量时可以同时赋值,如int count = 10;

变量名不能使用C语言的关键字(如int、for、while等)。

示例:

int age; // 定义整型变量
float salary; // 定义浮点型变量
char grade = 'A'; // 定义并初始化字符变量

age = 20; // 赋值
salary = 3500.50; // 赋值

变量的作用域

根据变量的定义位置,有不同的作用域:

  • 局部变量:在函数或复合语句内部定义,只能在该函数或复合语句内使用
  • 全局变量:在函数外部定义,可以被程序中所有函数使用

不同函数中可以使用相同名字的局部变量,它们互不影响。

示例:

int global = 10; // 全局变量

void func1() {
  int local = 20; // 局部变量
  // ...
}

void func2() {
  int local = 30; // 另一个局部变量,与func1中的local互不影响
  // ...
}

变量练习题

1. 以下哪个是有效的变量名?
正确答案:B

解析:变量名只能包含字母、数字和下划线,不能以数字开头,不能使用关键字。A以数字开头;C是关键字;D包含连字符。

2. 以下代码的输出是什么?
#include <stdio.h>
int global = 5;

void func() {
  int local = 10;
  global = global + 1;
  printf("%d %d ", global, local);
}

int main() {
  int local = 20;
  func();
  printf("%d", local);
  return 0;
}
正确答案:A

解析:func()中修改了全局变量global为6,输出6和局部变量local=10;main()中输出自己的局部变量local=20。

3. 以下代码的输出是什么?
#include <stdio.h>
int main() {
  int a = 5, b = 10;
  {
    int a = 20;
    b = b + a;
    printf("%d ", a);
  }
  printf("%d %d", a, b);
  return 0;
}
正确答案:A

解析:复合语句内a=20,输出20;复合语句外a恢复为5,b=10+20=30,输出5和30。

4. 以下关于变量初始化的说法,正确的是?
正确答案:C

解析:全局变量和静态局部变量不初始化时值为0;普通局部变量不初始化时值为随机值。

5. 以下代码的输出是什么?
#include <stdio.h>
int main() {
  int x = 10;
  int y = x++ + ++x;
  printf("x=%d, y=%d", x, y);
  return 0;
}
正确答案:A

解析:x++返回10(x变为11),++x返回12(x变为12),y=10+12=22。

知识点总结与易错点

关键知识点总结

基本数据类型

  • 整型:char(1B)、short(2B)、int(4B)、long(4/8B)、long long(8B)
  • 浮点型:float(4B, 6-7位有效数字)、double(8B, 15-16位)、long double(8/12B)
  • 字符型:char(1B),可表示-128~127的整数或ASCII字符

常量

  • 字面常量:直接使用的数值(10, 3.14, 'A')
  • 符号常量:#define定义的常量(如#define PI 3.14159)
  • const常量:const int MAX = 100;
  • 字符串常量以'\0'结尾,字符数组长度需比实际字符数多1

变量

  • 命名规则:字母/下划线开头,包含字母、数字、下划线
  • 先定义后使用:int count; count = 10;
  • 初始化:int count = 10;
  • 作用域:局部变量(函数内)、全局变量(函数外)

易错知识点总结

1. 整型溢出

当给整型变量赋超出其范围的值时,会发生溢出:

short s = 32767; // short最大值
s = s + 1; // 结果变为-32768(溢出)

预防:了解各类型取值范围,需要大数值时使用long或long long。

2. 整数除法

整数相除结果仍为整数,小数部分被丢弃:

int a = 5, b = 2;
float c = a / b; // c = 2.0,不是2.5

解决方法:将其中一个操作数转换为浮点型:

float c = (float)a / b; // c = 2.5

3. 字符与字符串混淆

字符常量用单引号('A'),字符串用双引号("A"):

char c = 'A'; // 正确
char c = "A"; // 错误!"A"是字符串(包含'A'和'\0')

字符串实际是字符数组,不能直接赋值给char变量。

4. 未初始化变量

使用未初始化的变量会导致不可预知的结果:

int count;
printf("%d", count); // 输出值不确定

最佳实践:定义变量时总是初始化。

5. 变量作用域错误

在函数外部访问局部变量会导致编译错误:

void func() {
  int x = 10;
}

int main() {
  printf("%d", x); // 错误!x在func()中是局部变量
}

解决方法:合理设计变量作用域,或使用全局变量。