C语言知识初步概括
1、关键字、常量与变量
关键字
这些关键字都是咱c语言可能要用到的一些称谓,所以不能给自己定义变量时定于同一个名字啊。不然编译器肯定不给你过,它可不知道你的想法。
数据类型
根据数据的特点设置了若干集合,并用不相同的名称指称每一个集合,称为数据类型。例如(int short等等)这部分是整数型,而(float double)等为实数型.(实数就是能1.3333 能表示这种类型的数据)
那为什么 整数型有一个int 和 shot都是整数型,float和double都是实数型呢?
因为计算机存储是二进制表示的,就是 一个位(bit)只能表示 0或者1.因为只能表示0和1是不是太少了?所以我们就引入了能表示8个bit的字节(byte)2的八次方是不是就是16*16=256,这样是不是能表示的数据就更多啦。但其实这么小的范围其实是不够我们用的所以啊,咱其实都是用如下的数据类型来表示的。
C语言常用的数据类型和VC环境下的表示范围
char 是字符型 就像 ‘a’ ‘B’ '1’啊这类都是字符型。 你键盘上的字符这是不是很多啊。随处可见。
然后 除了最后的三个浮点型(float、double···),其他都是整数型。
常量
在你的数据类型前面加个const就是常量,例如 const in a=3; 这个关键词可不得了,你一加,就不能对a这个常量进行赋值操作了。不然编译器不给你编译的。
定义
#include<stdio.h>//导入头文件 文件格式要为c,不然这个void main主函数是不被c++格式下c++的编译环境下认可的。
void main
{
int a=3;//我定义了一个叫a的整数型(int)变量,并给它初始化为3,初始化就是定义的时候赋值
//命名规范要求不能以数字开头,比如 int 3df,这样是错误的 但你可以 int x1; int x2;这种形式。
}
2、屏幕输出和输入
屏幕输出函数printf()
理解
printf的函数定义为printf(“输出格式字符串”,表达式1,表达式2,····);
这个是啥意思勒?
其实就是,你输出格式字符串里决定了你输出的是什么类型的数据类型。(是实数啊还是字符啊还是整数啊,你不用一个标识给电脑知道,电脑咋弄懂你的想法)
示例
//复制粘贴到你的编译器中感受一下吧!
//万分注意,c才是c语言的文件,你可不要使用cpp。不然如下代码会
//因为void main函数报错的。 不同编译器要求不同
#include<stdio.h> //引入库文件 //两个斜杠的作用就是电脑不会把它之后一行的内容当作代码处理 include是导入的意思 咱得先把你要
//用到的制作c语言的开发人员规定的基本函数给告诉编译器,编译器才知道有这些函数。比如printf就在这个<stdio.h>这个库文件里面
void main() //main 就是一个主函数,咱程序都是从main这个函数里执行的 {}这个是函数体,里面装载着你的代码。
{
printf("%d %c %f %lf",1,'a',1.3,1.5);
}
格式符
以下是控制控制输出在屏幕时的对齐方式以及显示时的宽度
转义字符
什么是转移字符勒?
就是你要让你这个编译器能够识别出你想表示的信息。
比如%d表示整数 哪怎么输出%d勒?这个时候你就需要%%了。
printf("\\");//表示输出\符号
printf("\n");//表示回车
格式化输入函数scanf
理解
scanf的基本格式如下:
scanf(“输入格式字符串”,地址1,地址2,地址3,···)
可能小伙伴们疑惑了啥是地址啊?简单来说就是你这个要存储你这个输入的内容的空间在内存哪里。就像你要给我纯键盘输入的东西,你得给我个房间吧,来放这个东西吧。而这个地址就是这个房间的号码。
格式符
示例
//复制粘贴到你的编译器中感受一下吧!
#include <stdio.h> //引入库文件 //两个斜杠的作用就是电脑不会把它之后一行的内容当作代码处理 include是导入的意思 咱得先把你要
//用到的制作c语言的开发人员规定的基本函数给告诉编译器,编译器才知道有这些函数。比如printf就在这个<stdio.h>这个库文件里面
void main() { //main 就是一个主函数,咱程序都是从main这个函数里执行的 {}这个是函数体,里面装载着你的代码。
//定义数据类型
int a = 3; //方式1
int b;// 方式2
b =3;
//这是两种不同方式定义变量。所产生的效果也是不同的。
//第一种你定义了的时候就把这个房间放了东西了。
//第二种就是你决定你要使用一个房间,但是房间里的空间并没有被清理,而是当你
//给这个房间放东西时,你才会先把它给清理,在放你的东西。
int c;
scanf("%d",&c);//这个&符号表示的是获取你变量在内存的位置,也就是你的房间号在哪啦。
printf("%d",c);
}
3、基本算术运算
优先级与结合性的表
相信大家都很清楚加减乘除是有顺序和优先级的吧。上图就是一个表示这个关系的图例。
其中向左的箭头就是左结合,意思就是,从右往左。同理可知右结合。
优先级越小,就越先执行这条命令。
位运算
什么是位运算其实也就是数值以二进制的方式进行相应的运算。
例如
char a=3; //内存中的表现形式 0000 0011 //一个字节8位
char b=1; //内存中的表现形式 0000 0001
//当进行计算 a&b 其实也就是 0和0是0,0和1也是0,二者不能有一方为0;
//当进行计算a|b 其实也就是,两者只要有一者为1就是1
//~a 取反,例如 此时表达式(~a)的值二进制表现为是 1111 1100
//a^b 异或 就是咱要相同就为0,不同就为1 例如 1和1 相同就是0 0和1不同就是1; 值为0000 0010
//>>右移 原本a=3 0000 0011 a>>1; 值变为 0000 0001;1
//<<左移 原本a=3 0000 0011 a<<1; 值变为 0000 0110;10
跟我们日常生活中相比特殊的一些的运算符
int a = 3;
a*=3; //这个就是一个表达式 他最后表示的值其实是a=9,所以不仅仅
//这个表达式的值是9,连这个变量a的值也进行了改变。
int a = 3;
a *3; //变量a的值并没有改变,但是这个表达式(a*3)的值也是9。
int b=1;
priintf("%d",b++);//1
priintf("%d",++b);//2
//语句就是int a;
//或 int a=3,b=5; 以分号结束的代码。
//在这里 定义一个变量 当在同一个数据类型,同一个语句即可如以上定//义多个语句。
//这两者的区别在于,这个自增运算符(++)的位置不同,当然在c语言中
//产生的效果也是不同的,1这个语句中++在后面,所以当执行完这个
//printf这条语句后,b才自增 所以1输出的是1 但是执行完后这个语句后,b的值变为了2;
//而方式二就不太一样了,它是先自增的,所以 就相当于咱先把b变成3 再输出 也就是执行语句的时候,b就自增完毕了。
int a = 3>2?1:2;
//这个是个三元表达式 表达式?形参1:形参2; 如果表达式为真即不等于0,则执行a =1否则执行 a=2
逗号运算符
表达式1,表达式2,表达式3
int a =(3,4,5);
//a最后的值时 最后一个表达式的值即5;
//可能小伙伴你决定它有啥用啊?
int b=0,c=2;
//那我给你个例子 int e= b++,c++,a;
//是不是前面两个的变量b\c都发生了自增,这也是它的一个妙处所在。
数据类型的自动转换
转换的原则
占用字节较少的转换为占用字节较多的。
隐式转换:
例如
int a=3;
double b=4;
a*b; //在该表达式中 ,因为二者数据类型不同,所以占用字节数小的int(4)被转换成占用字节大的(double)类型与b进行运算。
//那么a还是int吗计算完后 ,a当然还是int 类型,当计算时,其实只是产生了一个不知道名字的形式参数(与a的值相同)的double型变量与b相乘。
显示转换:
int a=3;
double c = 4.5;
(int)c; //该表达式中的值其实是4,因为大转小时,内存空间变小,实数型会自动把小数点后面的值给省去。所以也就只剩4了。
ASCCI
ASCII是啥,其实也就是这些字符在内存中的值.
示例
int a = 'A'; //其实也就是 a=65的意思。
4、宏常量与宏替换
解释
宏常量是用宏定义生成的符号常量,比如#define N 10,那么N就是宏常量。 宏替换也叫宏扩展,是指编译时在#define N 10之后凡可见这个N的地方的独立N都要被换成10。
示例
#include<stdio.h>
#define N 10 //N就是宏常量 代表着10这个意思
void main()
{
printf(N); //当编译时,N被替换成10;
}
5、分支语句
if和if else和else
原型
if(表达式) 表达式的值为0是不执行为假,当不为0则为真执行。
#include<stdio.h>
void main()
{
int a=1;
if(a==0)
printf("123");
if(a==1)
{
printf("355");
}
//当不使用函数体时,if如果判断成功,只能执行之后的一条语句printf("123"···,但是当变为{}函数体,判断为真则函数体内的多条语句都将被执行。
int b=4;
if(b==1)
printf("123")
else if(b==2)
printf("234")
else
prinf("12183");
//这种形式其实就是先判断b是不是1啊,是不是2啊,还是其他的。如果满足谁,它就执行谁。哪万一都不满足咋办?当然是都不执行啦。
}
switch
int a=3;
switch(a)
{
case 1:printf("123");break;
case 2:printf("234");break;
case 3:printf("345");break;
default: ;break;
//当a==3时执行第三条语句,break退出这个分支语句。如果不使用退出语句的break;代码将会一直执行下去.
//例如 case1和case2以及case3没有break语句跟着后,且此时表达式的值为1;那么 将执行case1到default的break;退出分支语句。输出123234345.
//其中default是不满足以上case条件时执行的。
}
6、循环控制
for
定义
for (表达式1;表达式2;表达式3)
{
}
表达式1执行一次,表达式2判断条件,表达式3每循环一次执行一次
for(;;)//当三者都为空时,将一直执行
{
printf("1");
printf("2");
}
//如果只是二为空也是一直执行
int i;
for(i=0;i<3;i++)
{
printf("123");
}
//在一些传统的c语言编译环境 for(int i=0;i<3;i++);是不被认可的,因为要先定义 int i; 再for(i=0;i<3;i++);定义了一个int i=3;是无法再弄个int i =4的,你想想这不都重名了,是吧。
//这样将执行三次printf语句。
//当然函数体{}是为了能够循环多个语句,不然只有一个语句,也就是只能用一个分号,哪够用啊。
while
定义
while (表达式1)
{
}
int a=0;
while(a<3)
{
printf("1234");
a++;
}
//这种形式也是执行三次,当我们不知道结束条件时,很有用。
do while
定义
do
{
}
while(表达式1)
int a=0;
do
{
a++;
printf("123);
}while(a<3)
// 执行了3次;
//其实这个也就是先做再判断
注意:
当这三个函数允许使用continue或者break。
for(int i=0;i<3;i++)
{
printf("123");
break;
}
//执行一次退出了for循环。
for(int i=0;i<3;i++)
{
continue;
printf("123");
}
//没有执行过printf函数,因为当continue时自动到下一次循环。即i=0时变成i=1时然后结束。
7、函数
定义
返回值类型 函数名(参数){函数体}
注意
函数不能定义嵌套,
也就是void main主函数里面不可以定义它的
#include<stdio.h>
void hello()//void 是想表示没有返回值
{
printf("你好啊")
}
int value(int i)//记住里面的每个参数都要指明数据类型如(int a,int b)····
{
return i;
}
void main()
{
hello();
printf("%d".value(3)); //调用value值为3传入形式参数(也就是复制了3这个值的一个临时的变量在函数体内进行函数体内规定昊好的相应操作,return 后要紧接返回类型的值,如果是无返回值函数void 函数名(){} 则不需要return);
}
上面的是先定义再使用;其实也可以把定义好的函数声明一下,也可以使用。
#include<stdio.h>
void main()
{
//声明
void hello();//声明不写函数体
int value(int); //可以省略形参名。
hello();
printf("%d".value(3)); //调用value值为3传入形式参数(也就是复制了3这个值的一个临时的变量在函数体内进行函数体内规定昊好的相应操作,return 后要紧接返回类型的值,如果是无返回值函数void 函数名(){} 则不需要return);
}
void hello()//void 是想表示没有返回值
{
printf("你好啊")
}
int value(int i)//记住里面的每个参数都要指明数据类型如(int a,int b)····
{
return i;
}
递归函数
什么是递归函数勒,其实就是一个可以自己调用自己的函数,但是我们要规定好一个边界,不然 就得运行出岔子。
#include<stdio.h>
void main()
{
//声明
int decrease(int a)
//调用时 a=3 然后不满足if语句 执行下面的语句 3- (2-(1));值为0;这就是一个经典的递归函数调用方法。
printf("%d".decrease(3)); //调用value值为3传入形式参数(也就是复制了3这个值的一个临时的变量在函数体内进行函数体内规定昊好的相应操作,return 后要紧接返回类型的值,如果是无返回值函数void 函数名(){} 则不需要return);
}
int decrease(int a)
{
if(a==1)
reruen 1;
return a-decrease(a-1);
}
8、变量的作用域和生存期
展示
#include<stdio.h>
static int a=3;//静态变量,在程序执行前就被定义好了。存储在堆内存。
int ab =4;//是全局变量作用域为其后面的所有语句
void main()
{
int b=4; //局部变量,随着main的调用产生,随着main的结束而结束。存储在栈内存。
}
void get()
{
int a=3;//局部变量,随着get的调用产生,随着get的结束而结束。存储在栈内存。
}
//栈内存比堆内存要小得多,但更靠近电脑处理逻辑的核心,所以执行速度较堆更快。静态变量因为从诞生到程序的结束而结束,存在周期特久远,所以规定它在堆内存。
应操作,return 后要紧接返回类型的值,如果是无返回值函数void 函数名(){} 则不需要return);
}
int decrease(int a)
{
if(a==1)
reruen 1;
return a-decrease(a-1);
}
## 8、变量的作用域和生存期
### 展示
```c
#include<stdio.h>
static int a=3;//静态变量,在程序执行前就被定义好了。存储在堆内存。
int ab =4;//是全局变量作用域为其后面的所有语句
void main()
{
int b=4; //局部变量,随着main的调用产生,随着main的结束而结束。存储在栈内存。
}
void get()
{
int a=3;//局部变量,随着get的调用产生,随着get的结束而结束。存储在栈内存。
}
//栈内存比堆内存要小得多,但更靠近电脑处理逻辑的核心,所以执行速度较堆更快。静态变量因为从诞生到程序的结束而结束,存在周期特久远,所以规定它在堆内存。