数据类型、运算符与表达式
对应教学日历:讲次 2(3月12日)
一、基本数据类型
| 类型 | 关键字 | 字节数(32位) | 取值范围 | 格式符 |
|---|---|---|---|---|
| 整型 | int | 4 | -2,147,483,648 ~ 2,147,483,647 | %d |
| 单精度浮点 | float | 4 | ±3.4×10⁻³⁸ ~ ±3.4×10³⁸(6~7位有效数字) | %f |
| 双精度浮点 | double | 8 | ±1.7×10⁻³⁰⁸ ~ ±1.7×10³⁰⁸(15~16位有效数字) | %lf |
| 字符型 | char | 1 | -128 ~ 127 或 0 ~ 255 | %c |
重点记忆:
int4 字节、float4 字节、double8 字节、char1 字节。
整型的修饰符
| 类型 | 说明 |
|---|---|
short int(或 short) | 短整型,通常 2 字节 |
long int(或 long) | 长整型,通常 4 或 8 字节 |
unsigned int | 无符号整型,最高位参与数值 |
signed int | 有符号整型(默认) |
字符型
char存储的是 ASCII 码值(整数)- 字符常量用单引号:
'A','0','\n' - 大小写转换:
'a' - 'A' = 32 - 转义字符:
\n(换行)、\t(制表)、\\(反斜杠)、\'(单引号)、\"(双引号)、\0(空字符)
二、常量与变量
常量
| 类型 | 示例 | 说明 |
|---|---|---|
| 整型常量 | 100, -50, 0xFF(十六进制), 012(八进制) | 无小数点 |
| 浮点常量 | 3.14, -2.5e3, .5 | 有小数点或指数 |
| 字符常量 | 'A', '\n', '\101'(八进制) | 单引号单个字符 |
| 字符串常量 | "Hello", "" | 双引号,以 \0 结尾 |
| 符号常量 | #define PI 3.14159 | 宏定义,编译前替换 |
变量
变量定义:
类型 变量名 [= 初始值];
int a; // 定义整型变量 a(未初始化,值为随机垃圾)
int b = 10; // 定义并初始化
float x, y, z = 0; // 同时定义多个,z 初始化为 0
char ch = 'A'; // 字符变量- 变量名遵循标识符命名规则(字母/下划线开头,不含特殊字符)
- 先定义后使用——C语言要求所有变量在使用前必须声明
- 未初始化的局部变量值不确定(内存中的垃圾值)
三、运算符与表达式
算术运算符
| 运算符 | 含义 | 示例 | 结果 |
|---|---|---|---|
+ | 加法 | 5 + 3 | 8 |
- | 减法 | 5 - 3 | 2 |
* | 乘法 | 5 * 3 | 15 |
/ | 整除(整数相除得整数) | 5 / 3 | 1 |
% | 取余(仅整数) | 5 % 3 | 2 |
重点:整数除法结果为整数(截断舍去小数)。
5 / 3 = 1,不是1.666。 若需小数结果,应使用5.0 / 3或(float)5 / 3。
关系运算符(结果为 0 或 1)
> < >= <= == !=
易错:等于用
==(双等号),不是=(单等号是赋值)!
逻辑运算符
| 运算符 | 含义 | 说明 |
|---|---|---|
&& | 逻辑与(AND) | 两边都为真才为真 |
| ` | ` | |
! | 逻辑非(NOT) | 取反 |
短路求值:
a && b若a为假,不再计算b;a || b若a为真,不再计算b。
赋值运算符
= += -= *= /= %=
a += 5; // 等价于 a = a + 5;
b *= 2; // 等价于 b = b * 2;自增/自减运算符
| 运算符 | 含义 | 说明 |
|---|---|---|
++i | 前置自增 | 先加后用:i 先加 1,再用 i 的值 |
i++ | 后置自增 | 先用后加:先用 i 的值,i 再加 1 |
--i | 前置自减 | 先减后用 |
i-- | 后置自减 | 先用后减 |
重点:考试常考点!
int a=3, b=++a;→a=4, b=4;int a=3, b=a++;→a=4, b=3。
条件运算符(三目)
表达式1 ? 表达式2 : 表达式3
// 若 表达式1 为真 → 结果 = 表达式2
// 若 表达式1 为假 → 结果 = 表达式3逗号运算符
a = (b=3, b+5); // b=3,然后 a=8sizeof 运算符
sizeof(int) // 4
sizeof(char) // 1
sizeof(a) // 变量 a 的字节数运算符优先级(从高到低速记)
| 优先级 | 运算符 |
|---|---|
| 1 | () [] -> . |
| 2 | ! ~ ++ -- +(正) -(负) *(取值) &(取地址) sizeof |
| 3 | * / % |
| 4 | + - |
| 5 | < <= > >= |
| 6 | == != |
| 7 | && |
| 8 | ` |
| 9 | ?: |
| 10 | = += -= 等 |
| 11 | , |
四、数据类型转换
自动类型转换(隐式)
- 低精度 → 高精度:
char → int → float → double - 表达式中的转换规则:将所有操作数统一转换为最高精度的类型再进行计算
- 赋值转换:将等号右边的类型自动转为左边的类型
int a = 5;
double b = a; // b = 5.0(int → double 自动)
int c = 3.14; // c = 3(double → int,截断小数,不四舍五入!)强制类型转换(显式)
(类型名)(表达式)
float x = 5.7;
int y = (int)x; // y = 5(截断)
float z = (float)5 / 3; // z = 1.666667作业示例
ex3-1:基本四则运算
#include <stdio.h>
int main()
{
int a,b;
printf("请输入两个整数:");
scanf("%d%d",&a,&b);
printf("%d*%d=%d\n",a,b,a*b);
printf("%d+%d=%d\n",a,b,a+b);
printf("%d/%d=%d\n",a,b,a/b); // 注意:整数除法!
printf("%d-%d=%d\n",a,b,a-b);
return 0;
}要点:
- 整数除法得整数,
a/b结果是截断的整数 scanf格式符与变量类型必须匹配(%d对应int)- 没有除数为 0 的检查(这是不严谨的,实际编程需要判断)
ex3-2:宏定义与浮点运算
#include "stdio.h"
#define PI 3.14159
int main()
{
float radius, length, area, volume;
scanf("%f%f",&radius,&length);
area = PI * radius * radius;
volume = area * length;
printf("%.6f",volume); // 保留 6 位小数
return 0;
}要点:
#define PI 3.14159宏定义,使用时直接文本替换%f用于float的输入输出%.6f控制小数位数
ex3-3-1, ex3-3-2:宏定义与格式输出
#include "stdio.h"
#define DIR "C:\\ABC.TXT"
int main()
{
printf("%s",DIR); // 输出字符串宏
return 0;
}#include "stdio.h"
int main()
{
int a=1234;
float b=1.23456;
char ch='z';
printf("a =%8d\n",a); // 宽度8,右对齐
printf("b =%8.2f\n",b); // 宽度8,2位小数
printf("ch=%8c\n",ch); // 宽度8
return 0;
}要点:
%8d→ 宽度 8,右对齐(默认)%8.2f→ 总宽度 8,2 位小数%s输出字符串
ex3-4:进制转换输出
#include <stdio.h>
int main()
{
int a;
scanf("%d",&a);
printf("The decimal system: %d\n",a); // 十进制
printf("The octal system: %o\n",a); // 八进制
printf("The hexdecimal system: %x\n",a); // 十六进制
return 0;
}要点:
%d十进制、%o八进制、%x十六进制- 仅控制输出显示,变量内部的二进制值不变
ex4-3:使用 math.h 数学函数
#include<stdio.h>
#include<math.h>
#define PI 3.14159265
int main()
{
int a;
double result;
scanf("%d",&a);
result=(cos(50*PI/180.0)+sqrt(37.5))/(a+1);
printf("%.2f\n",result);
return 0;
}要点:
#include<math.h>数学库头文件cos()参数是弧度(不是角度),角度转弧度:角度 × π / 180sqrt()平方根函数- 编译时需要链接数学库:
gcc -o prog prog.c -lm
作业重点
- 数据类型及取值范围:
int(4字节)、float(4字节)、double(8字节)、char(1字节) - 整数除法:
5/3 = 1,不是1.666;取余%只能用于整数 ++i(前置)和i++(后置)的区别- 逻辑运算符的短路求值
==(等于)和=(赋值)必须区分- 强制类型转换:
(类型名)表达式,小数转整数截断不四舍五入 - 宏定义
#define只是文本替换,不加分号