C语言概述ConsoleApplication1
C语言特点
优点
代码量小
执行速度快
功能强大
编程自由
缺点
写代码实现周期长
可移植性较差 posix
对平台库依赖较多
C语言的简洁
C语言仅有32个关键字,9种控制语句,34种运算符,
32个关键字
数据类型关键字 (12个)
char - 字符型数据
int - 整型数据
float - 单精度浮点数
double - 双精度浮点数
void - 无类型/空类型
short - 短整型
long - 长整型
signed - 有符号类型
unsigned - 无符号类型
struct - 结构体
union - 共用体
enum - 枚举类型
控制语句关键字 (12个)
if - 条件判断
else - 条件分支
switch - 多路选择
case - 分支标签
default - 默认分支
for - 循环语句
do - 循环语句
while - 循环语句
break - 跳出循环/switch
continue - 继续下一次循环
goto - 无条件跳转
return - 函数返回
存储类别关键字 (5个)
auto - 自动变量(通常省略)
extern - 外部变量声明
register - 寄存器变量
static - 静态变量
const - 只读变量
其他关键字 (3个)
sizeof - 计算数据类型大小
typedef - 类型定义
volatile - 易变变量
9种控制语句
条件判断语句
if语句
if (条件) {
// 条件为真时执行
if-else语句
if (条件) {
// 条件为真时执行
} else {
// 条件为假时执行
}
在c语言中 如果判断的结果是一个数字 非0表示条件成立 0表示条件不成立
多路选择语句
switch-case语句
switch (表达式) {
case 值1:
// 语句
break;
case 值2:
// 语句
break;
default:
// 默认语句
}
表达式计算结果只能为(字符/整数)
case:值只能是(字符/整数)的字面量 不能是变量
case穿透 case从上往下
循环语句
for循环
for (初始化; 条件; 更新) {
// 循环体
}
如果用vc 要把初始化定义在上面 或者 int i; i=1
变量只在所属的大括号里面是有效的
三元运算判断最大或最小
while循环
while (条件) {
// 循环体
}
给你一个整数判断是否为2的幂
while(i>1&&i%2==0){
n = n/2}
do-while循环
do {
// 循环体
} while (条件);
跳转语句
break语句 - 跳出循环或switch 嵌套循环只能跳出内循环
continue语句 - 跳过本次循环剩余部分
goto语句 - 无条件跳转到标签处 goto a; a:
制表符
\t 长度可变的大空格 让整体长度达到8或者8的倍数
34种运算符
运算符优先级
小括号优先所有
一元>二元>三元
&&>||>赋值
算术运算符 (7个)
-
- 加法
-
- 减法
* - 乘法
/ - 除法
不能除0
% - 取模(求余)
取余 运算符必须为整型 结果的符号跟第一个数字保持一致 不允许%0
整数计算 结果一定是整数 小数计算结果一定是小数 整数和小数计算 结果是小数 小数直接参与计算 结果可能不准确
++ - 自增
-- - 自减
先用后加 先加后用
在windows系统下
前缀优先于后缀
前缀统一自增/自减,再把结果拿出来用
后缀统一先用,等整个表达式中变量用完了再进行自增
再mac Linux系统下
前缀后缀优先级一样
从左到右依次计算
每个前缀和后缀都是独立的各题
关系运算符 (6个) 成立1(真) 不成立0(假)
== - 等于
!= - 不等于
- 减法
- 大于
< - 小于
= - 大于等于
<= - 小于等于
逻辑运算符 (3个)
&& - 逻辑与 两边都为真
|| - 逻辑或 两边都为假
! - 逻辑非
当左边的表达式能确定整个表达式的结果 右边不需要参与了
位运算符 (6个)
& - 按位与
| - 按位或
^ - 按位异或
~ - 按位取反
<< - 左移
- 右移
赋值运算符 (11个)
= - 简单赋值
+= - 加赋值
-= - 减赋值
*= - 乘赋值
/= - 除赋值
%= - 模赋值
&= - 位与赋值
|= - 位或赋值
^= - 位异或赋值
<<= - 左移赋值
= - 右移赋值
其他运算符 (1个)
? : - 条件运算符(三元运算符)
a>b?a:b;
逗号运算符(分隔符)
从左到右
最后一个子表达式的结果,是整个表达式结果
优先级最低
隐式转换
把一个取值范围小的变成大的 小的自动变大的 进行运算
short char 类型的数据在运算的时候 先提升int
强制转换
目标数据类型 变量名 = (目标数据类型)被强转的数据
int b = 10;
short i = (short)b;
前置转换底层原理 去掉前面不要的
字符相加
字符跟数字进行转换的时候会查询ASCLL码表
DLL库的封装
使用Visual Studio(day01)
使用工具的使用
调试 试图
快捷键ctrl+f5生成结果
System函数(system.c)
不记得系统库可以用快捷方式ctrl+j
可以直接调用一个外部命令
C语言编译步骤
一步编译gcc -o hello.exe hello.c qq.exe qq.c 后面可以加一个或者是多个
C语言编译步骤
C代码编译成可执行程序经过四步
1预处理 宏定义展开 文头件展开 条件编译 去掉注释 gcc -E hello.c -o hello.i
2编译 检查语法 将C语言转成汇编语言 gcc -S hello.i -o hello.s
3汇编 将汇编语言转成机器语言(二进制码) gcc -c hello.s -o hello.o
4链接 将C语言依赖库链接到程序中 hello.o -o hello
c语言注释
//单行 /**/ 多行
注释快捷键格式 ctrl k c
取消注释ctrl k u
常量
常量在程序的执行过程中 其值不能发生改变的数据
常量的分类?每种常量的书写格式
整型 实型 字符常量(''之间没有任何东西 报错) 字符串常量(""中间没有任何东西 是对的)
实型常量 .93 等同于0.93
18. 等同于 18.0
整形常量
12340000
1.2340000*10^7 不是常量 是一个计算过程
实型常量:1.2340000E7
输出常量
占位符
整型 %d
实型 %f
字符 %c
字符串 %s
printf(参数1,参数2);
参数1 输出内容的最终样式以字符串的形式体现
参数2:选填:填补的内容
printf("阿伟的年龄:%d岁",18)
printf("%d",18+18);
输出常量两个小扩展
输出多个常量:占位符对应常量
输出换行:
操作系统 换行符
windows \r\n
mac \r
Linux \n
printf("%s\n","sss")
在c语言中直接输出\n 自动识别
变量
变量:变量是存储数据的小盒子 不是里面的数据
先定义在赋值
数据类型+变量名
经常发生改变的数据可以定义变量
在vc这个软件平台上面 变量定义要统一放在最上面
变量注意事项
只能存一个值
变量名不允许重复定义
一条语句可以定义多个变量
变量在使用之前一定要进行赋值
变量的作用域范围
计算机存储规则
在计算机中 任意数据都会以二进制的形式来存储
十进制 0123456789
逢十进一
借一当十
二进制01 每一个0或1称为比特位 每八个比特位称为一个字节 字节为计算机最小存储单位
逢二进一
借一当二
图片就是像素组成
声音数据 记录音频数据
常见的进制
三个二进制分为一组得到的 八进制
四个二进制分为一组得到的 十六进制
二进制 有0和1组成 代码中以0b开头
十进制 由0~9 组成 前面不加任何前缀
八进制:由0~7组成 代码前面中以0开头
十六进制:由09还有af组成 代码中以0X开头
任意进制转十进制
公式:系数*基数的权次幂 相加
系数:每一位上的数
基数;当前进制数
权:从右往左 依次为0123...
二进制转十进制8421
十进制转其他进制
除基取余法 不断除以基数 得到的余数,直到商为0 再把余数倒着拼即可
数据类型
short int long longlong
整数类型大小由编译器决定
long a = 1000L;
printf("%ld\n",a);
long long d = 10000LL;
printf("%lld\n",d);
利用sizeof()测量每一种数据类型占用多少字节
sizeof(变量名/数据类型)
printf("%zu\n",sizeof(int))
整数类型的两个小扩展
long int a = 1000L;定义变量完整形态 除了int 本身
short long longlong
有符号整数 无符号整数定义
signed有符号整数 正数 负数
unsigned无符号整数 正数
signed int e = -100;
unsigned int num1 = 1234;用%u 占位符
小数
float double
float a = 3.14F;
printf("%.2f\n",a);小数点保留两位
编译器默认double
double b = 1.78;
printf("%.2lf\n",b);
字符类型
char 字符里面不能写中文汉字与字符 打印不出来
char d = 'a';
printf("%c\n", d);
include<stdio.h>
int main() {
int a = 10;
printf("%d\n", a);
int b = 20;
printf("%d\n", b);
printf("hello word\n");
printf("%zu\n", sizeof(int));
char d = 'a';
printf("%c\n", d);
return 0;
}
short %d
标识符
由数字,字母,下划线(_)组成
不能以数字开头
不能是关键字
区分大小写
代码文件名:全部小写 单词之间用下滑线隔开 开头可以用数字
键盘录入
scanf 是scanner format 的缩写 是c语言提供的一个函数
使用方式
scanf("%d",&变量名)
| scanf | scanf_s |
|---|---|
| 安全性 | 不安全,可能缓冲区溢出 |
| 标准 | C标准函数 |
| 编译器支持 | 所有C编译器 |
| 使用要求 | 不需要大小参数 |
| 错误处理 | 返回成功读取的项目数 |
| 第一个参数中不写换行 |
字符串
字符串变量的定义方式
数据类型 变量名【内存大小】 = 字符串;
char str [内存占用大小] = "asda";
内存占用大小计算方式;
英文:1个字母 符号 数字 占用一个字节
中文:在vs或者vc中 默认情况下 一个中文占用2个字节
结束标记一个字节
char str[5] = "aaaa";
printf("%s\n", str);
键盘录入可以录入多个符号
间隔最好用空格
include <stdio.h>
int main() {
int num1, num2;
printf("请输入两个数字: ");
// scanf_s对于整数输入与scanf用法相同
if (scanf_s("%d %d", &num1, &num2) != 2) {
printf("输入错误!\n");
return 1;
}
printf("两数之和: %d\n", num1 + num2);
return 0;
}
函数
函数就是程序当中独立的功能
返回值类型 函数名(形参1,形参2..){
函数体;
return 返回值;
}
调用函数
变量 = 函数名(实参..);
printf("占位符",函数名(实参..));
形参和实参必须一一对应
干什么事情 定义函数
需要什么 形参
调用处是否继续需要实现 返回值类型
函数的注意事项
函数不调用就不执行
函数名不能重复
函数与函数之间是平级关系,不能嵌套定义
自定义函数写在main函数的下面 需要在上方申明
return下面 不能编写代码 永远执行不到
函数返回值类型为void,表示没有返回值 return可以省略不写
c语言中的math文件
pow();幂
sqrt();平方根
ceil();向上取整
floor();向下取整
abs();绝对值
time.h
time();
获取当前时间
使用就是time(NULL);形参 表示获取的当前时间是否需要在其他时间存储 不需要存储NULL
返回值long long
随机数
c语言中的随机数是伪随机数
导入头文件<stdlib.h>
设置种子//初始值 每一个随机数都是通过前一个数字再结合一系列复杂计算得到的 设置种子srand(1);
获取随机数//获取随机数 rand()
输出打印
获取一个随机数
设置种子//初始值 每一个随机数都是通过前一个数字再结合一系列复杂计算得到的 设置种子srand(1);
获取随机数//获取随机数 int num = rand()
解决种子不变 随机数结果是固定的 srand(time(NULL))还需要导入时间的函数time.h
解决随机范围 : 默认情况下是0~32767
把这个范围变成包头不包尾 包左不包右的1-101
拿着尾巴-开头 101-1=100
修改代码 取余%100
数组
数组定义
是一种容器 可以用来存储同种类型的多个值
数组特点 是一个连续的空间 一旦定义,长度不可改变
数据类型 数组名[长度]
数组初始化
初始化:定义数组的时候,第一次给数组赋值
数据类型 数组名[长度]={数据值1,....}
长度省略: 数据值的个数就是数组长度
长度未省略: 数据值个数<=长度
为赋值的部分有默认初始化
整数:0
小数:0.0
字符:'\0'
字符串:NULL
数组元素访问
数组名[索引]
数组名获取
变量=数组名[索引]
printf("占位符",)
修改
数组名[索引]=数据值
索引0-数组长度-1
内存和内存地址
内存:软件在运行时 用来临时存储数据的
内存中的变量和数组
变量的首地址 通过首地址可以获取所有地址
首地址:&a 返回的是整个 int 变量的首地址(起始位置)
内存分配:虽然 10 这个数值很小,但 int 类型仍然分配固定大小(通常是4字节)
内存内容:
有效数据存储在低位字节
高位字节用0填充(对于正数)
负数和较大的数会使用更多字节
字节序:数据的存储顺序取决于系统的字节序(大端/小端)
总结:取地址获得的是整个 int 变量的首地址,从这个地址开始的多个字节共同存储这个整数的值,即使数值很小也会占用完整的 int 类型大小。
&变量名;可以获取变量的
int a = 10;
printf("%p\n",&a);
数组内存地址
首地址[索引]
int arr[]={}
&arr;
&arr[0];
所取得值都是内存首地址
&arr[1];内存的角度:偏移量(首地址+往后进行偏移)
数组长度计算公式:总长度/数据类型占用的字节个数
数组作为函数的参数
实际上传递的是数组的首地址 如果要在函数中对数组进行遍历的话 一定要把数组传递传进去
定义处:arr表示的就是完整的数组
函数中的arr:只是个变量 用来记录数组首地址
void p (int arr[]){
printf("%p\n",arr)//直接可以打印数组首地址 不需要&
}
数组常见算法
基本查找 二分查找
指针
指针变量定义格式
数据类型 * 变量名
int*
*p
浙公网安备 33010602011771号