☰
C语言第二讲
2026/10/23 2:56:59 网站建设 项目流程

C语言数据类型和变量

目录

  • 1 数据类型的介绍
    • 1.1 字符型
    • 1.2 整型
    • 1.3 浮点型
    • 1.4 布尔类型
    • 1.5 各种数据类型的长度
      • 1.5.1 sizeof 操作符
      • 1.5.2 一个字节是8个bit位
  • 2 signed 和 unsigned
    • 2.1 size_t 类型
  • 3 数据类型的取值范围
  • 4 变量
    • 4.1 变量的创建
    • 4.2 变量的分类
  • 5 算术操作符
    • 5.1 + 和 -
    • 5.2 * 乘法运算
    • 5.3 / 除法运算
    • 5.4 % 取模(余)
  • 6 赋值操作符
    • 6.1 连续赋值
    • 6.2 复合赋值
  • 7 单目操作符
    • 7.1 ++ 和 --
    • 7.2 + 和 - (正负号)
  • 8 强制类型转换
  • 9 scanf 和 printf
    • 9.1 printf 用法
      • 9.1.1 基本用法
      • 9.1.2 占位符
      • 9.1.3 占位符列举
      • 9.1.4 输出格式
        • 9.1.4.1 限定宽度
        • 9.1.4.2 总是显示正负号
        • 9.1.4.3 限定小数位数
        • 9.1.4.4 输出部分字符
    • 9.2 scanf 输入
      • 9.2.1 基本用法
      • 9.2.2 scanf的返回值与原理
      • 9.2.3 占位符与赋值忽略符

1 数据类型的介绍

用整数类型来描述整数字符数类型描述字符浮点数类型描述小数。
数据类型就是int ,char等。
类型就是相似的数据所具有的共同特征。
编译器只有知道了数据的类型才知道怎么操作数据。
数据类型分为内置类型和自定义类型。
内置类型又分为字符型,整型,浮点型,布尔类型。

1.1 字符型

  • 关键字: char (character)
  • 描述:用于描述字符。

1.2 整型

  • 关键字: int (integer)
  • 描述:用于描述整数(如 1, 2, 3, 4)。
  • 细分:
  • 短整型: short int == short
  • 长整型: long int == long
  • 长长整型: long long int == long long

1.3 浮点型

  • 描述- 关键字: int (integer)
  • 描述:用于描述整数(如 1, 2, 3, 4)。
  • 细分:
  • 短整型: short int == short
  • 长整型: long int == long
  • 长长整型: long long int == long long
    :小数 == 浮点数,它的类型叫浮点型。
  • 细分:
  • 单精度浮点型: float
  • 双精度浮点型: double
  • 精度更长的浮点型: long double

1.4 布尔类型

  • 关键字: _Bool
  • 描述:有些值只有真/假两种类型,这些值叫布尔值。
  • 规则:0表示假,非0则为真。
  • 头文件:需包含 <stdbool.h> 。
  • 示例代码:

c

#include <stdbool.h>
int main() {
_Bool n = true; // n赋值为true或false
if(n)
printf(“真”);
return 0;
}

(注:早期C语言可能使用宏定义 #define bool _Bool )

1.5 各种数据类型的长度

每一种数据类型都有自己的长度。

1.5.1 sizeof 操作符

  • 定义: sizeof 是一个关键字,也是一个操作符,专门用来计算 sizeof 的操作数类型的长度。
  • 单位:字节。
  • 用法: sizeof 用 %zd 输出。
  • 示例:

c

printf(“%zd\n”, sizeof(char)); // 输出 1 (1个字节)
printf(“%zd\n”, sizeof(int)); // 输出 4 (4个字节)

  • 标准规定: sizeof(long) >= sizeof(int) 。

1.5.2 一个字节是8个bit位

  • bit位:计算机识别的二进制 0/1,称为 1 bit 位。
  • 换算:- 1 字节 (char) == 8 bit- 1 字节 (_Bool) == 8 bit- 注意: sizeof(a) 当 a 为变量时,等同于 sizeof a (可以省略括号)。

2 signed 和 unsigned

  • signed (有符号的):可正、可负、可0。例如 signed int num。默认就是 signed。
  • unsigned (无符号的):仅正或0。例如 unsigned int num。- 作用:声明 unsigned 的好处是,同样长度的内存能够表达的最大整数值增加了一倍。- signed short int (16位): -32768 ~ 32767- unsigned short int: 0 ~ 65535 (最大值扩大一倍)- char 的特殊性:char 是否有正负号由当前系统决定,可能是 signed char 也可能是 unsigned char。

2.1 size_t 类型

  • 定义:sizeof 的计算结果为 size_t 类型。
  • 打印格式:- %zd (有符号整数,C99标准引入)- %u (打印无符号整数,对应 unsigned int)- %lu (对应 unsigned long)- %llu (对应 unsigned long long)- 目的:C语言统一了一下,创造了 size_t,用来统一表示 sizeof 的返回值类型。

3 数据类型的取值范围

  • 问题:为什么有那么多数据类型?因为每一个数据类型的取值范围不同 (min, max)。
  • 查询工具:- limits.h 文件说明了整型类型的取值范围。- float.h 文件说明了浮点型类型的取值范围。

4 变量

类型就是用来创建变量,例如,有一个类型int用int来创建一个变量。

4.1 变量的创建

  • 概念:C语言中把经常变化的量(年龄,身高)称为变量,不变的量(身份证号,血型)称为常量。
  • 语法:数据类型 变量名;

c

int age; // 变量名字叫age,它的类型是int
double weight;

  • 初始化:创建变量的同时给它一个初始值。

c

int age = 20;
char ch = ‘q’;
float weight = 50.5f; // 如果写50.5,编译器会认为是double,加f表示float

4.2 变量的分类

  • 全局变量:在大括号外部定义的变量。使用范围更广(整个工程可用)。
  • 局部变量:在大括号内部定义的变量。使用范围比较局限(只在所在范围使用)。- 作用域冲突:如果局部变量与全局变量名字相同,局部变量优先。- 内存存储:- 栈区:存放局部变量、函数参数。- 堆区:动态内存管理。- 静态区:存放全局变量、静态变量。

5 算术操作符

加(+),减(- ),乘(*),除( / ),取余(% ), 均为双目操作符。
操作符也叫运算符。

5.1 + 和 -

  • 双目操作符:有两个操作数(左操作数,右操作数)。
    c
    int a = 3 + 5;3为左操作数,5为右操作数。

5.2 * 乘法运算

  • 双目运算符。

c

printf(“%d”, num * 5);

5.3 / 除法运算

  • 整数除法:除号两端都是整数,则计算结果也为整数(截断小数部分)。
    c

printf(“%d\n”, 8 / 2); // 4
printf(“%d\n”, 6 / 4); // 1 (不是1.5)

  • 浮点数除法:除号两端至少有一个是浮点数,则计算的是小数除法。

c

printf(“%f\n”, 6.0 / 4); // 1.500000

5.4 % 取模(余)

  • 定义:求得整除之后的余数。

c

printf(“%d\n”, 10 % 3); // 1

  • 限制:只可作用于整数,不可作用于浮点数。
  • 符号规则:负数求模,余数的符号取决于第一个整数的符号。
  • 11 % -5 -> 1
  • -11 % 5 -> -1
  • -11 % -5 -> -1

6 赋值操作符

= 赋值操作符。

6.1 连续赋值

c

int a = 3;
int b = 5;
int c = 0;
c = b = a + 3; // 不推荐这种写法,建议分开写

  • 规则:从右向左依次赋值。

6.2 复合赋值

  • a = a + 5; 可以简写为 a += 5; (先加后赋)。
  • 其他复合赋值符: *= , /= , %= , += , -= 。

7 单目操作符

单目操作符(++,–,+,-),只有一个操作数。

7.1 ++ 和 –

  • 功能:自增1 / 自减1。
  • 前置 (++a):先加1,后使用。

c

int a = 5;
int b = ++a; // a变为6,b也等于6

  • 后置 (a++):先使用,后加1。

c

int a = 5;
int b = a++; // b先拿到5,然后a才变为6

7.2 + 和 - (正负号)

  • 正号 (+):对正负号没有影响,可省略。 int a = +10; 等同于 int a = 10; 。
  • 负号 (-):用来改变一个值的正负号。

8 强制类型转换

  • 语法: (类型)
  • 示例:

c

int a = (int)3.14; // 强制转换为int
printf(“%d\n”, a); //如果没有int, 输出 3,报警告。加上int之后,a=3无警告。

  • 注意:无int 会有警告,只保留整数部分。

9 scanf 和 printf

9.1 printf 用法

printf = print + format (格式)。将数据按指定格式打印。需要头文件 <stdio.h> 。

9.1.1 基本用法

c

printf(“Hello, world!\n”);

9.1.2 占位符

可以在输出文本中指定占位符,用后面的参数替换。

  • %d :十进制整数
  • %f :浮点数
  • %c :字符
  • %s :字符串

9.1.3 占位符列举

  • %c : char
  • %d : int (十进制)
  • %f : float / double (默认保留6位小数)
  • %lf : double (在scanf中必须用%lf,printf中%f即可)
  • %hd : short int
  • %hu : unsigned short int
  • %ld : long int
  • %lld : long long int
  • %p : 指针(用来打印地址)
  • %u : unsigned int
  • %x : 十六进制整数
  • %zd : size_t

二进制由0和1组成
8进制由0到7组成
16进制由0到9,abcdef组成
10进制由0~9组成

9.1.4 输出格式

printf() 可以定制占位符的输出格式。

9.1.4.1 限定宽度

Printf允许限定占位符的最小宽度(最小宽度的限制)。

  • %5d : 最小宽度为5位。如果不够5位,左边补空格(右对齐)。
  • %-5d : 左对齐。
  • %05d : 不够的地方用0填充(如 00123)。
    %5d等价于%空格5d,不够的地方用空格填充
    对于小数限字符会限制所有数字的最小显示宽度。
9.1.4.2 总是显示正负号
  • %+d : 打印正数时显示 + 号,打印负数时显示 - 号。
9.1.4.3 限定小数位数
  • %.2f : 小数点后保留两位(四舍五入)。
  • %8.2f : 总宽度至少8位,小数点后2位。
9.1.4.4 输出部分字符

占位符%s默认打印所有字符

  • %.ns : 对于字符串,只打印前 n 位。

c

printf(“%.3s\n”, “abcdef”); // 输出 abc

9.2 scanf 输入

Scanf是可以给变量输入值
scanf() 函数用于读取用户的键盘输入。程序运行到这里会停下来等待用户输入。
scanf 需要取地址操作符

9.2.1 基本用法

  • 语法: scanf(“格式字符串”, &变量地址);
  • 注意:变量前面必须加 & (取地址操作符),除了数组名本身代表地址外。
  • 安全性:scanf 是不安全的(可能导致缓冲区溢出)。VS编译器建议使用 scanf_s,但 scanf_s 是微软特有的,不具备跨平台性。
  • 解决方法:在代码第一行加上 #define _CRT_SECURE_NO_WARNINGS 。

9.2.2 scanf的返回值与原理

原理:用户输入放入缓冲区,scanf 依照占位符对缓存进行解读。

  • 返回值:返回成功读取的变量个数。
  • 如果读取失败或遇到文件结束,返回 EOF (-1)。
  • 应用:常用于 OJ (Online Judge) 题目中的循环输入。

c

while(scanf(“%d %d”, &a, &b) != EOF) { … }

9.2.3 占位符与赋值忽略符

scanf所用占位符与printf 基本一致,scanf在读到后面的空格时会停止。

  • 空格处理: %d , %f 等会自动跳过前面的空白字符(空格、换行、制表符)。但 %c 会读取空格。对%c,空格字符也是字符,输入的时候也要加上空格
    -%s:scanf 后面是%s的时候意味着要读一个字符串,字符串要放在数组里面即字符数组
  • 赋值忽略符 * :
  • 在 % 和格式符之间加 *,表示读取该数据但不赋值给变量(跳过该数据)。

c

int year, month, day;
// 读取时跳过中间的横杠 ‘-’
scanf(“%d%*c%d%*c%d”, &year, &month, &day);

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询