正式开始!
1. 什么是C语言
- 广泛应用于底层开发
- 标准语法 ANSI C,国际标准。
- 计算机语言 二进制语言
- 汇编语言 (助记符)
- B语言
- C语言 国际标准
工具
Clang,GCC,MSVC等
- 创建一个项目。
- 创建一个源文件。
- 写代码
- 编译代码
晕了,安装路径改不了;C盘还好够装,但是上网搜了可以用软链接连到D盘什么的,我还没学会。
新建源文件
-
源文件(.c)
-
头文件(.h)
-
写代码
-
vs2013需要修改项目属性–>控制台显示,
-
vs2019开始就不需要修改属性了。
-
有且仅有一个main函数
①一个工程中可以有多个.c文件;
②但是多个.c文件只能有一个main函数。
C语言
- C实现数据结构;
C++方向
- C++(高阶的数据结构);<Linux+操作系统+计算机网络>
- 数据库;
- 实战项目;
Java测试开发
- JavaSE+基础的数据结构
- JavaWeb(Web技术+操作系统+计算机网络)+高阶的数据结构;
- JavaEE;
- 实战项目。
数据类型
char //字符数据类型
short //短整型
int //整型
long //长整型
long long //更长的整型
float //单精度的浮点数
double //双精度浮点数
//数据类型
//计算机语言-写程序-解决问题
//C语言 - 浮点数
// - 整型
-
sizeof
单位是:字节 - byte。 -
计算机中的单位:
(二进制(0,1) 八进制(0-7) 十进制(0-9))
①bit - 比特位 ;
②byte - 字节 = 8bit;
③kb = 1024byte;
④mb = 1024kb;
⑤gb = 1024mb;
⑥tb = 1024gb;
⑦pb = 1024tb。
-
C语言标准:
sizeof(long) >= sizeof(int)
-
类型的使用:用来创建变量。
变量,常量
🍖 | 🍦 | 🍇 |
---|---|---|
生活中 | 变 | 不变 |
C语言 | 变量 | 常量 |
定义变量的方法
-
类型 变量名 = 0;
-
变量的分类:局部变量,全局变量。
-
当局部变量与全局变量名字冲突时,局部优先。不建议把全局变量和局部变量同名。
-
使用
scanf()
报错:error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
解决方法:
#define_CRT_SECURE_NO_WARNINGS 1 //放第一行
-
- 用管理员身份打开记事本
- 打开这个路径
C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\VC\VCProjectItems
的newC++file
文件编辑: #define _CRT_SECURE_NO_WARNINGS 1
-
scanf_s()
函数是由 -vs提供的,不是C语言标准规定的。不要乱用自己不会的函数就行了。
变量的使用
作用域和生命周期
作用域
- 在哪里起作用,哪里就是作用域
- 局部变量的作用域:变量所在局部范围
- 全局变量的作用范围:整个工程!
生命周期
- 变量的生命周期:变量的创建和销毁之间的时间段
- 局部变量的生命周期:进入局部范围,生命开始,离开局部范围,生命结束
- 全局变量的生命周期:程序的生命周期
常量的类型
- 字面常量
- const修饰的常量
- define定义的标识符常量
- 枚举常量
//常量
#define MAX 10000
enum Sex {
//这种就是枚举类型
MALE,
FEMALE,
SECRET
};
int main() {
//1.字面常量
//3.14;
//10;
//'a';
//"asdfd";
//2.const修饰的常变量
//const int num = 10;//常变量 - 具有常属性(不能被改变的属性)
//num = 20;
//printf("num = %d\n", num);
//int arr[10] = { 0 };
//const int n = 10;
//int arr2[n] = {0};//n是变量,数组大小不能用变量表示
//3.#define定义的标识符常量(可以在{}内定义)
//int n = MAX;
//printf("n = %d", n);
//4.枚举常量
//可以被一一列举的常量
enum Sex s = MALE;
printf("%d\n",MALE);
printf("%d\n",FEMALE);
printf("%d\n",SECRET);
return 0;
}
字符串
-
int main() { //字符数组 - 数组是一组相同类型的元素 //字符串结尾的位置隐藏了 \0 的字符 //\0是字符串的结束标志 //char arr[] = "hello\0"; char arr1[] = "abc"; char arr2[] = { 'a','b','c' }; printf("%s\n",arr1); printf("%s\n", arr2); return 0; }
- \0是字符串的结束标志
-
出现未定义报错
strlen
未定义报错,解决:引用头文件<string.h> -
字符串的结束标志是一个
\0
的转义字符 ,而在计算字符串长度的时候\0
是结束标志,但不算作字符串内容。
转义字符
转义字符 | 释义 |
---|---|
\? | 书写连续多个问号时使用,防止他们被解析成三字母词 ??) --> ] //会被解析 |
\' | 用于表示字符常量' |
\" | 用于表示一个字符串内部的双引号 |
\\ | 用于表示一个反斜杠,防止他被解析为一个转义序列符 |
\a | 警告字符,蜂鸣 |
\b | 退格符 |
\f | |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ddd | ddd 表示1~3个八进制的数字。如:\120x |
\xdd | dd 表示2个十六进制数字。如:\x30 0 |
ASCII码,
int main() {
printf("%c\n", '\130');//八进制的130就是十进制88
//输出:X - ASCII码值为88
printf("%c\n", '\101');//A - 65 - 八进制:101
return 0;
}
注释
解释代码
/*
int a = 10;
*/
//C语言的注释风格
C的注释,不支持嵌套注释。
选择语句
循环语句
- while循环
- do…while循环
int main() {
//数组
int arr[10] = { 0 };
//输入
int i = 0;
for (i = 0; i < 10; i++) {
scanf("%d", &arr[i]);
}
//找最大值
int max = arr[0];//假设
for (i = 0; i < 10; i++) {
if (max < arr[i]) {
max = arr[i];
}
}
//输出
printf("max = %d", max);
return 0;
}
函数,数组
- 数组 - 一组相同类型元素的集合
-
// char ch[5] = { 'a','b','c' }; //不完全初始化,剩余的默认为0
操作符
- 算术操作符
int main() {
int a = 9 / 2;
float b = 9.0 / 2;
int c = 9 / 2.0;
printf("a=%d\nb=%f\nc=%d",a,b,c);
}
+ - * / %
- 移位操作符
>> <<
int main() {
int a = 2;
int b = a << 1;
printf("%d\n", b);
return 0;
}
a - 2 左移操作符 - 移动二进制位
移位,右边补0
- 位操作符
& | ^
按位与 按位或 按位异或
- 赋值操作符
= += -= /= &= ^= >>= <<=
- 单目操作符(只有一个操作数)
符号 | 含义 |
---|---|
! | 逻辑反操作 |
- | 负值 |
+ | 正值 |
& | 取地址 |
sizeof | 操作数的类型长度(单位:byte) |
~ | 对一个数的二进制按位取反(无所谓正负数) |
– | 前置,后置-- |
++ | 前置,后置++ |
* | 间接访问操作符(解引用操作符) |
(类型) | 强制类型转换 |
int main() {
//sizeof是一个操作符不是函数!
//计算类型或变量的大小
printf("%d\n", sizeof(int));
int a = 10;
printf("%d\n", sizeof a);
}
int main() {
int arr[10] = {0};
printf("%d\n", sizeof(arr));
//计算数组的总大小,单位字节
printf("%d\n", sizeof(arr[0]));
int sz = sizeof(arr) / sizeof(arr[0]);//求元素个数
printf("%d\n", sz);
printf("%d\n", sizeof(arr) / 10);
return 0;
}
int main() {
int a = 0;
printf("%d\n",~a);
//~ - 按位取反
return 0;
}
//所以 0 按位取反 最终得到 -1
~
:按二进制位取反,把所有二进制位中的数字:“1”–>“0”,“0”–>“1”
- 双目操作符(有两个操作数)
- 关系操作符
>
>=
<
<=
!=
==
-
逻辑操作符 逻辑与:
&&
,逻辑或:||
。 -
条件操作符(三目操作符)
exp1 ? exp2 : exp3
exp1成立:exp2计算,整个表达式的结果是exp2的结果;
exp1不成立:exp3计算,整个表达式的结果是exp3的结果。 -
逗号表达式:逗号隔开的一串表达式。
int main() { //(2, 3, 4, 5, 6 + 1); int a = 0; int b = 3; int c = 5; int d = (a = b + 2, c = a - 4, b = c + 2); //逗号表达式,从左到右依次计算 //整个表达式的结果是最后一个表达式的结果 printf("d = %d\n", d); return 0; }
-
下标引用,函数调用,结构成员
下标引用:
//[] - 下标引用操作符 int main() { int arr[10] = {1,2,3,4,5,6,7,8,9,10}; printf("arr[5] = %d\n",arr[5]); return 0; }
.
->
&
*
原码,反码,补码
整数a:0
二进制:00000000000000000000000000000000
~a: 11111111111111111111111111111111(按位取反)
整数在内存中存储的是补码。
一个整数的二进制表示有三种:
原码
反码
补码
-1:
10000000 00000000 00000000 00000001(原码)
11111111 11111111 11111111 11111110(反码)
11111111 11111111 11111111 11111111(补码)
对于负数:
最高位:符号位
反码:符号位不变,原码按位取反
补码:反码+1
对于正数:
原码,反码,补码相同
常见关键字
auto break case char const continue
default do double else enum extern
float for goto if int long
register return short signed sizeof
static struct switch typedef union unsigned
void volatile while
auto - 是自动的 - 每个局部变量都是auto修饰的。
自动创建,自动销毁 - 自动变量
auto省略掉了
int main() { { int a = 10;//自动变量 //auto 新的C语言语法中也有其他用法 } return 0; }
- extern - 是用来声明外部符号的。
register - 寄存器关键字。
大量/频繁地被使用地数据,放在寄存器中,提升效率
计算机中数据存储:
寄存器(快)(更小),高速缓存(几十MB),内存(8~16G),硬盘(500G),网盘(2T)
造价越高,速度越快,空间越小(<——)
int main() { register int num = 100;//建议放在寄存器中 return 0; }
- CPU - 中央处理器 —— 内存
- signed 有符号的 - 20,10
- unsigned 无符号的
- static 静态的!
- union 联合体。
- void
- volatile
不是关键字,而是预处理指令:
① define
② include