一.准备工作:
1.创建新项目(标志:解决方案资源管理器出现)![8691da98b53d44bd8d8f605fb1d323e3.png](https://img-blog.csdnimg.cn/8691da98b53d44bd8d8f605fb1d323e3.png)
(如果不小心关闭解决资源管理器,点击视图重新打开)
2.创建源文件(xx.c是源文件xx.h是头文件)![e83d21bf999d47929cf0cc9e9690c990.png](https://img-blog.csdnimg.cn/e83d21bf999d47929cf0cc9e9690c990.png)
二.写代码
1.写出主函数
int main()
{
return 0;
}
Q:为什么要敲空格空行
Int是一种函数返回类型(int是整型)
main是函数名
Q: int main函数是什么意思
Q: Return 0是什么
{ }中的内容是函数体
Q:函数体是什么
主函数是一个程序的入口, C语言代码从主函数第一行开始执行
※一个工程有且仅有一个main函数,
一个工程可以有多个.c文件,
但是多个.c文件只能有一个main函数
2.库函数( Printf是一种库函数,意思是在屏幕上打印信息)
库函数的使用需要引用头文件(打招呼)
头文件 #include<stdio.h>(放置在第1行)
Q:头文件是什么
[为看到结果,vs2013需要点击项目名称,属性系统,子系统控制台。 Vs2019不需要]
Q: Printf是什么
运行程序快捷键CTRL+fn+F5或点击调试,开始执行不调试
3.数据类型
·研究类型的大小
Step one打印一个整数
Step two打印字符数据类型的大小
Sizeof是一个关键字,也是c语言中的操作符,作用是计算类型或者变量所占空间的大小
以此类推
输出的结果是
sizeof的单位是字节byte
Q:为什么 long和int的大小相同
(参考C语言标准)
·数据类型是用来创建变量的
4.变量、常量
¹变量
·创建一个变量
Int是类型 age是变量的名字 =是赋值
变量意味着可变
要将变量的数值表示出来,需要用printf库函数
打印的类型
·变量的分类
变量分为局部变量和全局变量
局部变量:在大括号内定义变量都称为局部变量
全局变量:在大括号外部定义变量称为全局变量
当局部变量和全局变量名字冲突的情况,局部优先
但是不建议把全局变量和局部变量的名字写成一样的
·变量的使用
写一个代码,求两数相加
(其中scanf函数是输出函数 &是将数据存放在该位置,也就是取地址的意思)
第9行的内容是scanf函数的标准写法
写入完成后会报错,将错误列表中。输出内容复制到整个源文件的第1行,前面加#define,后面加1
vs编译器提供的scanf_s函数,不能在其他编译器使用,不是c语言标准规定的内容
想完全解决这个问题,可以在Microsoft visual studio中搜索newc++file.cpp文件,右键单击编辑,用记事本打开,粘贴#define _CRT_SECURE_NO_WARNINGS 1
另存并替换,权限不够时,以管理员身份运行记事本,在记事本中打开该文件,重新复制粘贴操作以上。以后新建的文件自动添加这句话
·变量的作用域和生命周期
局部变量的作用域:变量所在的局部范围
全局变量的作用域:
全局变量的作用域是整个工程,这里的第3行内容就是一个全局变量
在相同工程,不同的源文件中的全局变量也可以使用,需要用extern进行声明
变量的生命周期是指变量的创建和销毁之间的之间的时间段
局部变量的生命周期:进入局部范围,生命开始初局部范围生命结束
全局变量的生命周期:整个程序的生命周期
常量:![ead700eb4dc44b0d8ca8dbadbc9f5dc7.png](https://img-blog.csdnimg.cn/ead700eb4dc44b0d8ca8dbadbc9f5dc7.png)
字面常量
const修饰的常变量
这里的number就是常变量,具有常属性(不能被改变的属性)
但const修饰的常变量,并不能作为常量来使用,其本身仍然是变量
arr是数组
#define定义的标识符常量
枚举常量(用于可以一一列举的常量)
这里的male ,female和secret就是变量的未来可能取值
枚举常量默认赋值从0开始
5.字符串和转义字符,注释
字符串就是一串字符(用双引号括起来的一串字符),字符串的结束标志是\0的转义字符,字符串的末尾隐藏了\0
验证\0的存在
在第7行代码中手动加入\0
求字符串的长度
\0是作为字符串的结束标志存在,但不计入字符串的长度
arr2后没有\0,所以打印出的大小是随机值
转义字符(转义字符可以用来解决问题)
这里的\转变了test中t的原来意思,
如果要想打印test,则要将\test中的转义
如果想要打印双引号,前面两个双引号会被识别成一对双引号,就发生了错误,所以此处要给需要表示的双引号加转义符号
特殊的转义字符\ddd表示1~3个8进制数如\130
X的ASCII码值是88,8进制的130是10进制的88
A的ASCII码值是65,10进制的65是101
\xdd表示2个16进制数字如\x30
注意八进制数字没有8
所以这个长度应该是14
注释
注释是用来解释复杂代码的
在代码前加∥,是C++注释风格
/*int b=0*/,是C语言注释风格(不支持嵌套注释)
常用C++注释风格
6.条件语句![ef2c621797d54e4da268a7cfdafc6339.png](https://img-blog.csdnimg.cn/ef2c621797d54e4da268a7cfdafc6339.png)
7.循环语句![02f61984a28b4ab587e6adca44a712c3.png](https://img-blog.csdnimg.cn/02f61984a28b4ab587e6adca44a712c3.png)
8.函数
·求和的两种方式![179f5907e0ff4b7298cbc84353aea309.png](https://img-blog.csdnimg.cn/179f5907e0ff4b7298cbc84353aea309.png)
第一种方法没有使用函数的方式
第2种方法使用了Add函数的方式
(参数是函数与函数之间交流的方式)
9.数组(一种相同类型的元素的集合)![406a686136de4250883e45b889f2b87a.png](https://img-blog.csdnimg.cn/406a686136de4250883e45b889f2b87a.png)
Int\char表示数据类型,arr\ch表示数据名称,[]表示元素个数,第8行内容为不完全初始化,剩余的默认为0
数组是用下标来访问的:当写出arr[0]时,访问第1个元素,依次类推;
将数组的内容全部打印出来
10.操作符
算术操作符+ - * / %
除号两端都是整数,执行整数除法
除号两端有一个是小数,执行小数除法
%表示取模(取余)
移位操作符>> <<
左移操作符,移动的是二进制
2:000000000000000000000000000010
向左移动一位00000000000000000000000000000100(4)
位操作符&(按位与) ∧(按位或) |(按位异或)
赋值操作符![0e9a649abb174541aaf19873c0378bda.png](https://img-blog.csdnimg.cn/0e9a649abb174541aaf19873c0378bda.png)
单目操作符![44c5ff539ab540d1bed2b58fd4c94144.png](https://img-blog.csdnimg.cn/44c5ff539ab540d1bed2b58fd4c94144.png)
!表示逻辑取反
sizeof是计算类型或变量大小的操作符
sizeof后面的变量的括号可以省略,类型的括号不可以省略( 所以sizeof是操作符不是函数)
sizeof也可以计算数组的总大小(单位是字节)
也可以计算数组中某个元素的大小
应用: 计算数组元素个数
~对一个数的二进制按位取反
把所有二进制位中数字,1变成0,0变成1
0二进制:00000000000000000000000000000000
所以二进制就变成了111111111111111111111111111111
整数在内存中存储的是补码(一个整数的二进制表示有三种:原码,反码,补码)
一个整数的最高位表示符号位:
-1:
100000000000000000000000000001(原码)
111111111111111111111111111110(反码)
111111111111111111111111111111(补码)
(反码的二进制序列加1得到补码)
Q:在什么地方加1
规定:正整数的原码,反码,补码相同
++:自增运算符
前置++计算规则,先++后使用
Q:为什么a的值也是11
后置++运算规则:先使用后++
(类型)强制类型转换
在3.14前加入(int),实现强制类型转换
关系操作符
> >= < <= !=(不相等) ==(相等)
逻辑操作符
&&逻辑与 II逻辑或
逻辑与中,只要有一个为假就为假,两个同时为真才为真
逻辑或中只要有一个为真结果就为真,只有两个都是假结果才为假
条件操作符(三目操作符)
exp1?exp2:exp3(exp:表达式)
逻辑:
exp1如果成立, exp2计算,整个表达式的结果是esp2的结果;
exp1如果不成立,exp3计算,整个表达式的结果是exp3的结果
逗号表达式:逗号隔开的一串表达式![17a815cc0de44cdba26a8da0389c12bf.png](https://img-blog.csdnimg.cn/17a815cc0de44cdba26a8da0389c12bf.png)
下标引用、函数调用和结构成员
[] () . ->
第1个[] 是定义数组时的语法,第2个是下标引用操作符常见关键字
C语言提供的关键字:
1. 是C语言提供的,不能自己创建关键字
2.变量名不能是关键字
auto是自动的-每一个局部变量都是auto修饰的
extern是用来申明外部符号的
register寄存器关键字
计算机中数据可以存储到:寄存器、高速缓存、内存、硬盘、网盘
signed有符号的 unsigned无符号的
static静态的 struct结构体、关键字
switch语句 typedef类型定义
union联合体、共用体 void无、空
( defind 、include的不是关键字,是预处理指令)
typedef类型重定义
可以将unsigned int重新定义为u_int
static静态的:
1. static修饰局部变量
2. static修饰全局变量
3. static修饰函数
Example1
在int a前加static
static修饰局部变量,改变了局部变量的生命周期(本质上改变了变量的存储类型)
Example2
全局变量在整个工程中都可以使用
static修饰全局变量,使得这个全局变量只能在自己所在的源文件(.c)内部使用,其他源文件不能使用
全局变量在其他源文件内部可以被使用,是因为全局变量具有外部链接属性;但是被static修饰之后就变成了内部链接属性,其他源文件就不能链接到这个静态的全局变量了
Example 3
全局函数的基本使用
static修饰函数,使得函数只能在自己所在的源文件内部使用,不能在其他源文件内部使用
(本质上 static是将函数的外部连接属性变成内部连接属性)
11. #define定义常量和宏
define是一个预处理指令
1.define定义符号
2. define定义宏
如果4*ADD(2,3)
可以发现宏的作用方式是替换
所以宏的书写应该为
Q:宏是什么
12.指针
内存:
2^32次方个内存单元
Q:内存是怎么编号的?一个这样的内存单元是多大空间?
一个内存单元是一个字节,然后分配地址。
打印出a的地址