【C语言简明教程】(一):数据类型,表达式与控制结构

前言

  • 本系列C语言教程将补充C语言的基础部分,适合具有一定语言基础的朋友进行复习。
  • 以下是本系列的目录
    • 数据类型(本节)
    • 运算符(本节)
    • 表达式(本节)
    • 控制结构与语句(本节)
    • 函数定义和调用
    • 函数与变量
    • 数组定义和引用
    • 字符串使用
    • 数组与函数
    • 编译预处理
    • 指针定义和使用
    • 指针与数组、与字符串、与函数
    • 结构体定义、结构体数组、结构体指针
    • 文件定义和操作。
    • 常用算法
  • 关于数值和指针两个难点,可以参考之前写的文章,浅显易懂,适合初学者的朋友

0 一些补充

0-1 ASCII(American Standard Code for Information Interchange)码表
  • 范围
    • 0~127 :标准 ASCII(7 位)
      • 0~31:控制字符(不可见,如 \n 换行、\t 制表)
      • 32~126:可打印字符(字母、数字、符号)
      • 127:删除符(DEL)
    • 128~255:扩展 ASCII(不同编码可能有差异,用于特殊符号和中文环境)
字符 ASCII 十进制 ASCII 十六进制 说明
A 65 0x41 大写字母
Z 90 0x5A 大写字母
a 97 0x61 小写字母
z 122 0x7A 小写字母
0 48 0x30 数字字符
9 57 0x39 数字字符
\n 10 0x0A 换行
\t 9 0x09 制表符
空格 32 0x20 空格

1 数据类型(Data Types)

  • C 语言里的数据类型(Data Types)可以理解为:
    • 变量能存什么样的数据,以及占多少内存
  • 一般可以分为4 大类:
    1. 基本数据类型(Basic Types)
    2. 整型扩展(Integer Variants)
    3. 构造类型(Derived Types)
    4. 自定义类型(User Defined)
1-1 基本数据类型(Basic Types)
  • 顾名思义,这是 C 语言最核心的类型
类型 说明 大小 取值范围 有效数字
char 字符类型 1 byte -128 ~ 127 / 0 ~ 255 ---
int 整数 4 bytes -2,147,483,648 ~ 2,147,483,647 ---
float 单精度浮点数 4 bytes ±1.18×10^-38 ~ ±3.4×10^38 6~7
double 双精度浮点数 8 bytes ±2.23×10^-308 ~ ±1.79×10^308 15~16
void 空类型 --- --- ---
  • 其中:void 常用于函数返回类型表示无返回值,或者表示指针 void* 通用指针类型。
  • 例子:
c 复制代码
char c = 'A';
int a = 10;
float f = 3.14f;
double d = 3.1415926;
  • 但是需要注意的式:C 语言标准(C89/C99/C11 等)并没有强制规定每种整数类型必须精确占用多少字节,而是只保证了一个"最小范围",即至少能表示一定大小的数值。不同平台(CPU 架构、操作系统、编译器)实际字节大小可能不同。
类型 最小位数 能表示的整数范围(有符号)
char 8 位 -128 ~ 127
short 16 位 -32,768 ~ 32,767
int 16 位 -32,768 ~ 32,767
long 32 位 -2,147,483,648 ~ 2,147,483,647
long long 64 位 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

1-2 整型扩展(Integer Variants)
  • C 语言可以通过 修饰符改变整数类型。
  • 修饰符:
c 复制代码
short  
long  
signed  
unsigned
  • signed 默认可省略;unsigned 没有负数
  • 组合实例:
类型 含义
short int 短整型
long int 长整型
unsigned int 无符号整型
long long int 超长整型
  • 例子:
c 复制代码
short s = 10;
long l = 100000;
unsigned int u = 20;
long long big = 123456789;

1-3 构造类型(Derived Types)
  • 由基本类型组合出来的类型。
类型 说明
数组 [] 一组相同数据
指针 * 存地址
结构体 struct 不同类型组合
共用体 union 共用同一块内存
函数 返回某种类型
  • 例子:
c 复制代码
//数组
int arr[5] = {1,2,3,4,5};
//指针
int a=10;
int* p=&a;
printf("%p\n", p); // 地址
//结构体
struct Student  
{  
	int id;  
	char name[20];  
};
1-3-1 共用体(union
  • 共用体(union)的特点是:所有成员共用同一块内存,同一时刻只能保存一个成员的值。
  • 也就是说,不同成员会覆盖同一块内存空间
c 复制代码
union Data
{
    int i;     // 4 bytes
    float f;   // 4 bytes
    char c;    // 1 byte
};
  • 共用体大小 = 最大成员大小
  • 也就是上述的变量i,f,c公用一个块内存
c 复制代码
sizeof(union Data) = 4
  • 因此修改其中一个值会导致其他的变量被覆盖(这东西一般不怎么常用就是了)

1-3-2 共用体 vs 结构体
特性 struct union
内存 每个成员独立 共用一块
大小 成员大小之和 最大成员大小
可同时存储 可以 不可以
  • 来个直观的例子:
    • 结构体 = 并排存储 [ a ] [ b ] [ c ] [a][b][c] [a][b][c]
    • 共用体 = 重叠存储 [ a / b / c ] [a/b/c] [a/b/c]
  • 一般我们用结构体就好了

1-4 自定义类型(User Defined)
  • C 语言允许我们自己定义类型:
类型 用途
typedef 起别名
enum 枚举
  • 例子:
c 复制代码
typedef unsigned int uint;
uint a = 10;

enum Color
{
    RED,
    GREEN,
    BLUE
};
1-4-1 枚举的赋值规则
情况 结果
没有指定初始值 从 0 开始,依次递增
指定初始值 后续成员 = 上一个值 + 1
中间成员指定值 后续成员继续依次 +1
  • 举例:
c 复制代码
enum Color {
    RED,
    GREEN,
    BLUE
};
  • 枚举类型本质上是 整数类型
  • 默认 从 0 开始依次递增
    • RED = 0
    • GREEN = 1
    • BLUE = 2
  • 如果手动指定了数值:
c 复制代码
enum Color {
    RED = 5,
    GREEN,      // 自动 = 6
    BLUE = 10,
    YELLOW      // 自动 = 11
};

2 运算符

  • C 语言运算符可以分为 七大类
类别 运算符示例 说明
1️⃣ 算术运算符 + - * / % ++ -- 数值计算
2️⃣ 关系运算符 == != > < >= <= 比较大小,结果为 0/1
3️⃣ 逻辑运算符 `&&
4️⃣ 位运算符 `& ^ ~ << >>`
5️⃣ 赋值运算符 `= += -= *= /= %= &= = ^= <<= >>=`
6️⃣ 条件运算符 ?: 三元运算符
7️⃣ 其他运算符 , sizeof & * ( ) [] -> . 地址、指针、逗号、sizeof等
2-1 算术运算符
运算符 说明 示例
+ a+b
- a-b
* a*b
/ a/b
% 取余 a%b(整数)
++ 自增 1 i++(后缀) / ++i(前缀)
-- 自减 1 i-- / --i
  • 注意
    • / 整数相除只保留整数部分
    • % 只能用于整数
    • 前缀 ++i 会先自增再使用,后缀 i++ 先使用再自增
  • / 整数相除只保留整数部分的例子:
c 复制代码
int a = 7, b = 3;  
int result = a / b;
printf("%d / %d = %d\n", a, b, result); //7 / 3 = 2
  • 前缀 ++i 与后缀 i++例子:
c 复制代码
#include <stdio.h>
int main()
{
    int i = 0;

    printf("%d\n", i++);  // 后缀 i++
    printf("%d\n", ++i);  // 前缀 ++i

    return 0;
}
  • 上述的输出 ![[Pasted image 20260307114754.png]]
  • i++后缀自增
    1. 先使用当前值 i(此时 i = 0
    2. 然后 i 自增 1 → i = 1
  • ++i前缀自增
    1. 先自增 1 → i = 2
    2. 再使用这个值

2-2 关系运算符
运算符 说明
== 等于
!= 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
特点
  • 返回值类型是 int,0 表示假,1 表示真

2-3 逻辑运算符
运算符 说明
&& 逻辑与,左右都为真才为真
`
! 逻辑非,取反

2-4 位运算符
运算符 说明
& 按位与
` `
^ 按位异或
~ 按位取反
<< 左移(乘 2)
>> 右移(除 2)
  • 注意
    • 位运算符只对整数有效
    • 左移可能溢出,要注意符号位
    • ^异或是\|或的相反:
      • 相同为 0
      • 不同为 1
  • 举例:
c 复制代码
#include <stdio.h>

int main() {
    int a = 5;   // 二进制 0101
    int b = 3;   // 二进制 0011

    // 按位与 &
    int c = a & b;  
    printf("%d & %d = %d\n", a, b, c); // 0101 & 0011 = 0001 → 1

    // 按位或 |
    int d = a | b;  
    printf("%d | %d = %d\n", a, b, d); // 0101 | 0011 = 0111 → 7

    // 按位异或 ^
    int e = a ^ b;  
    printf("%d ^ %d = %d\n", a, b, e); // 0101 ^ 0011 = 0110 → 6

    // 按位取反 ~
    int f = ~a;  
    printf("~%d = %d\n", a, f); // 0101 -> 1010 (补码表示) → -6

    // 左移 <<
    int g = a << 1;  
    printf("%d << 1 = %d\n", a, g); // 0101 -> 1010 → 10

    // 右移 >>
    int h = a >> 1;  
    printf("%d >> 1 = %d\n", a, h); // 0101 -> 0010 → 2

    return 0;
}

2-5 赋值运算符
运算符 含义 示例
= 普通赋值 a = b
+= 加后赋值 a += b 等同 a = a + b
-= 减后赋值 a -= b
*= 乘后赋值 a *= b
/= 除后赋值 a /= b
%= 取余后赋值 a %= b
&= 按位与后赋值 a &= b
` =` 按位或后赋值`
^= 按位异或后赋值 a ^= b
<<= 左移后赋值 a <<= 2
>>= 右移后赋值 a >>= 2
c 复制代码
int a;
int b;
a = b = 10; // 右到左赋值,a=10, b=10

2-6 条件运算符(三元运算符)
c 复制代码
a ? b : c
  • 如果 a 为真,则取 b,否则取 c
  • 可以嵌套使用
  • 举个例子:
c 复制代码
int max = (a>b) ? a : b;

2-7 其他常用运算符
运算符 说明
sizeof 计算变量或类型占用内存
& 取地址
* 指针解引用
, 逗号运算符,顺序执行多个表达式,以最后一个为结果
. 结构体成员访问
-> 指针访问结构体成员
() 函数调用或表达式分组
[] 数组下标
  • 这些后面讲指针和数组会提到

2-8 运算符优先级(核心常用部分)
  • 优先级高 → 低
优先级 运算符 类型
1 () [] -> . 括号、数组下标、结构体访问
2 ! ~ ++ -- + - * & 单目运算符、逻辑非、取地址、取值、自增自减
3 * / % 乘除余
4 + - 加减
5 << >> 位移
6 < <= > >= 比较大小
7 == != 等于不等于
8 & 按位与
9 ^ 按位异或
10 ` `
11 && 逻辑与
12 `
13 ?: 条件运算符
14 = += -= ... 赋值
15 , 逗号运算符

3 表达式

3-1 定义
  • 表达式(Expression)是由 变量、常量、运算符和函数调用按照一定语法组合起来的计算单元,最终会产生一个
  • 说人话:就是结合上一节的运算符写的式子
3-2 分类
  • 算术表达式(Arithmetic Expression)
    • 使用算术运算符 + - * / % ++ --
c 复制代码
int x = 10, y = 3;  
int z = (x + y) * 2;  // 先算 x+y=13,再乘以2 → z=26
  • 关系表达式(Relational Expression)
    • 使用关系运算符 `< > <= >= == !=
c 复制代码
int a = 5, b = 3;  
int result = a > b;   // 5>3 → 1(真)
  • 逻辑表达式(Logical Expression)
    • 使用逻辑运算符 && || !
c 复制代码
int x = 5, y = 0;  
int flag = (x > 0) && (y == 0);  // 1 && 1 → 1(真)
  • 位表达式(Bitwise Expression)
    • 使用位运算符 & | ^ ~ << >>
c 复制代码
int a = 5, b = 3;  
int c = a ^ b;  // 按位异或 → 6
/*解释:
	a=5;        0101      5	
	b=3;        0011      3
	c=a ^ b;    0110      6
*/
  • 赋值表达式(Assignment Expression)
    • 使用赋值运算符 = += -= *= /= ...
c 复制代码
int a = 5;  
a += 3;  // a = a + 3 → a=8
  • 条件表达式(三元表达式)
c 复制代码
int a = 5, b = 10;  
int max = (a > b) ? a : b;  // max=10

4 控制结构与语句

4-1 顺序结构(Sequential Structure)
  • 程序从上到下依次执行语句,这是最简单的控制结构
c 复制代码
#include <stdio.h>

int main() {
    int a = 5;
    int b = 10;
    int c = a + b;  // 顺序执行
    printf("c = %d\n", c);
    return 0;
}
4-2 条件结构(Selection / Branching)
4-2-1 if 语句
c 复制代码
int a = 0;
if (a > 0)
{
	printf("a>0\n");
}else if (a < 0)
{
    printf("a<0\n");
}else
{
	printf("a=0\n");
}
4-2-2 switch 语句
  • 在 C 语言里,switch 的表达式必须是整数类型或可以转换为整数类型。常用类型有:
类型 说明
int 最常用
char 字符型,可以使用 ASCII 码
short 短整型
enum 枚举类型,内部也是整数
long 长整型
c 复制代码
#include <stdio.h>

enum Color { RED, GREEN, BLUE };

int main() {
    char c = 'A';
    switch(c) {           // 可以用 char
        case 'A': printf("A\n"); break;
        case 'B': printf("B\n"); break;
    }

    enum Color color = GREEN;
    switch(color) {       // 可以用枚举
        case RED: printf("红\n"); break;
        case GREEN: printf("绿\n"); break;
        case BLUE: printf("蓝\n"); break;
    }

    return 0;
}
  • 同时要注意,case 标签对应的必须是常量
情况 可以用作 case? 说明
字面量 1、2、3 常量,编译时已确定
#define X 2 宏替换为常量,编译时已确定
enum { X=2 } 枚举常量
const int x = 2; × C语言中不是编译时常量,只是只读
普通变量 int x=2; × 运行时值,不能用
  • 注意每一个case语句要加上break防止穿透,但是有时故意省略 break 用于多 case 共用代码。
  • 我们来看一个例子:
c 复制代码
#include <stdio.h>  
  
int main() {  

int score = 85;  
  
switch(score / 10) { // 按分数段判断  
	case 10: // 100 分  
	case 9: // 90~99 分  
		printf("优秀\n");  
		break;  
	case 8: // 80~89 分  
	case 7: // 70~79 分  
		printf("良好\n");  
		break;  
	case 6:  
		printf("及格\n");  
		break;  
	default:  
		printf("不及格\n");  
}  
  
return 0;  
}

4-3 循环结构(Looping)
4-3-1 while 循环
  • 特点:先判断条件,满足才执行循环体。
c 复制代码
int i = 0;
while(i < 5) {
    printf("i = %d\n", i);
    i++;
}
4-3-2 do-while 循环
  • 特点:先执行一次循环体,再判断条件,至少执行一次。
c 复制代码
int i = 0;
do {
    printf("i = %d\n", i);
    i++;
} while(i < 5);
4-3-3 for 循环
  • 特点:适合已知循环次数,初始化、条件、更新语句集中在一行。
c 复制代码
for(int i=0; i<5; i++) {
    printf("i = %d\n", i);
}
  • 注意:在 for( ; ; i++)for( ; ; ++i) 中,循环行为 完全相同

  • 差异只在 循环体中使用 i++ 或 ++i 作为表达式时 ,才会影响输出或计算结果。

    • i++:先使用值,再加 1
    • ++i:先加 1,再使用值

4-4 跳转语句(Jump / Branching Statements)
语句 用途 示例
break 跳出循环或 switch for(...) { if(i==3) break; }
continue 跳过本次循环,进入下次循环 for(...) { if(i==3) continue; }
return 从函数返回 return 0;
goto 无条件跳转到标签 goto label; label: printf("跳转\n");
  • 请不要使用goto,否则你将会被大肆(((

小结

  • 本节介绍了C语言的数据类型,表达式与控制结构
  • 下一节我们将从函数开始
  • 如有错误,欢迎指出!
相关推荐
他们都不看好你,偏偏你最不争气2 小时前
【iOS】block
开发语言·ios·objective-c·block·闭包
工业甲酰苯胺2 小时前
PHP闭包中static关键字的核心作用与底层原理解析
android·开发语言·php
’长谷深风‘2 小时前
从零开始学 SQLite:从基础命令到 C 语言编程实战
c语言·数据库·sqlite·软件编程
冬夜戏雪2 小时前
【学习日记】
java·开发语言·数据库
小美单片机2 小时前
Proteus8.9安装保姆级教程
c语言·c++·算法·51单片机·proteus·大一新生
会编程的土豆2 小时前
C语言字符串查找:深入理解 strstr 函数
c语言·项目
Coding茶水间2 小时前
基于深度学习的茶叶病害检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
开发语言·人工智能·深度学习·yolo·机器学习
duoluoxia2 小时前
Qt PushButton 点一下 触发两边槽函数的问题
开发语言·qt
co_wait2 小时前
【C++ STL】list容器的基本使用
开发语言·c++·list