目录
1.分析我的第一个代码
1-1printf函数的补充
1-2main的格式
2.数据类型
2-1数据类型
2-2单位
3变量常量与作用域和生命周期
3.1变量
3.2作用域
3.2.1局部变量的作用域
3.2.2全局变量的作用域
3.3生命周期.. 12
3.4.1字面常量.. 13
3.4.2 const修饰的常属性变量
3.4.3 #define定义的字符常量
3.5枚举常量
1.分析我的第一个代码
#include<stdio.h>
int main()
{
printf("hehehe\n");
printf("hehehe\n");
printf("hehehe\n");
printf("hehehe\n");
printf("hehehe\n");
return 0;
}
程序1
1.这个代码的分析还是很有必要的首先我们要知C语言的语法规定:
int main()
{
return 0;
}
//这个主函数的框架可以理解为调用mian函数返回一个整型(在数据类型中int代表一个整型),与后面return 0相呼应 。那么我们就可以理解为调用main函数后返回一个整型0。
2.在有了main函数的框架后我们再看我们的程序1这里面我们出现了#include<stdio.h>这里意思是包括了标准输入输出---std为标准化 io代表in/output 原意思下文的printf函数为c语言自带的打印函数也是输出函数这是c自带的库函数为了用这个函数我们要向c申请所以才有了#include<stdio.h>这个头文件
3. printf("hehehe\n");我们发现函数调用结束都以;为结束标志。行那这个代码我们基本分析完毕 我们按下F5跑动程序如图:
Question1那这个时候可能会有疑问printf打印的是“”里的内容那我\n去哪里?
这个问题的话我们可以自己上机操作一下会,我们将\n去除再编译看
Question 2main函数到底是什么呢?
我在程序1中让程序跑起来按F10会有个箭头在第三行再按一次会来到第一个printf这个函数那然后依次往下在这个过程中。编译出来的hehe也会因为按一次F10而变多一次,所以我们可以推断出main函数是程序的入口
1-1printf函数的补充
1首先printf函数的使用:printf(”XXXXX”);
而printf(”XXXXX\n”);则多出了换行的效果。
2通常““双引号用来标注字符串,而‘‘单引号用来表示一个字符:
”a”与’a’
表示的也不一样前者表示字符串是同类型的集合而后者表示一个字符
3.再初始c语言中我看来其他大哥对于printf有个更简便的函数puts具有自动换行的作用不需要向printf那样用转义字符\n来换行看图
4.和printf(”%s\n”,变量名);通过格式控制符来输出不一样puts()更灵活可以直接将打印字符串常/变量,我们看图: //%s打印字符串;%c打印字符;%d打印数字
5.(未完待续)qaq水平比较差只能理解到这里后续学深入了会补上
1-2main的格式
格式1: int main()
格式2: int main(void)-- void空白的意思这里便是明确main函数里没有参数
格式3:int main(int x)--这个我现在的学习进度没有学到还我太笨了学的很慢QAQ.
2.数据类型
我们写代码是为了解决生活中的实际问题其实可以算的上是处理数据的问题在超市买水一瓶五元整数也就是整型,取健身房减肥一天减去了0.5斤小数浮点型。
2-1数据类型
char 字符型
short 短整型
int 整型
long 长整型
long long 根长整型
float 浮点型
double 双精度浮点型
那么问题有人产生了:
Question1:为什么同类型分类怎么多有长有短?
答:因为在定义变量的是 int age=10;我们们向内存申请一个age的空间里面存放10 ,那age是年龄啊年龄的话肯定不会特别大啊那我们想这名为age的空间能够比较合适的装入我们的数据而不造成内存的浪费所以呢我们就定义不同的长度根据数据大小申请合适长度的空间。
Question2那么到这是不是又会抛出一个问题我数据类型的空间有多大呢?
这里我们引出sizeof()---算出各种类型的大小 ,我在代码中额外算了下字符a在内存中的大小 看代码
运行结果为12448484单位为字节,我们看字符a为4字节这就很奇怪了讲道理应该为1这个时候我想是不是编译器把这个a当作ascii来算了这就是四个字节反正也很奇怪问了一个小伙伴也没有很好的解释,那我就换个方式来验证吧看下图
2-2单位
在计算机是存取都是以二进制的形式那计算机的最小单位是bit(比特):一比特只能有两种状态1或0
那上面如printf(“%d”,sizeof(int));输出结果为4byte(字节)这里我们给出进率 1byte(字节)=8bit;
1kb=1024byte=210byte
1mb=1024kb=210kb
1gb=1024mb=210mb
1tb=1024gb=210gb
1pb=1024tb=210tb
这里我们给出代码
#include<stdio.h>
int main()
{
int a = 104;
printf("%d\n", a);
printf("%c\n", a);
return 0;
}我们运行结果如图所示
哈哈这里
%C是打印字符
%d打印十进制
%x打印十六进制数字
%o打印八进制数
%s打印字符串
%p打印地址
图中显示我以十进制%d打印输出结果就是104,单我以字符%c打印就变成了h这里我们说明下这是ascii表对应的值为了简化将不同的字符赋予上了十进制的编码当我们打印字符时出现的h其实就算ascii编码104所对应的字符。
3变量常量与作用域生命周期
3.1变量
变化的量就叫变量 不变的量就叫常量。
这里我们给出代码并运行
#include<stdio.h>
int main(){
int a = 10;
printf("%d\n", a);
a = 20;
printf("%d\n", a);
return 0;
}
我们发现int a=10 打印出的是10 a=20后面a有变了一次这里就可以说明a是一个变量。
那么什么是局部变量什么是全局变量
#include<stdio.h>
int a = 20;//全局变量
int main()
{
int a = 10;//局部变量
return 0;
}
这里我们总结一下可以认为在{}括号里面的为局部变量 括号外的为全局变量 注意这里不能太局限的认为main函数里面的变量就算局部变量这里我再写出代码来
那么当全局变量名和局部变量名一样时会如何
我们发现当我们局部变量和全局变量名称一样时我们是局部变量优先级显然更搞,所以当我们写代码时局部变量和全局变量的变量名不建议一样。
3.2作用域
#include<stdio.h>
int main()
{
{
int a = 10;
printf("%d", a);
}
return 0;
}
这串代码是可以跑起来的但是我们换种写法我们将打印函数移到外面看看情况会如何
#include<stdio.h>
int main()
{
{
int a = 10;
}
printf("%d", a);
return 0;
}
我们发现直接报错了说局部变量a没有定义标识符 这里的报错原因局部变量a的作用域是再里层的小括号而打印函数出了局部变量a的作用域 这时候是输出不了的,所以作用域总结就算变量能起作用的区域。那这里我们可以总结出出了作用域局部变量将没有意义。
#include<stdio.h>
int a = 60;//全局变量
int main()
{
{
printf("%d\n", a);
}
printf("%d\n", a);
return 0;
}
从这串代码我们会发现全局变量的作用域是整个main函数。
3.3生命周期
上面得作用域其实就能说明生命周期,说白了就是变量起作用那就再生命周期内,出来生命周期变量就没有作用这里我们继续用这个程序来分析
#include<stdio.h>
int main()
{
{
int a = 10;//局部变量
printf("%d", a);
}
return 0;
}
这串代码向内存空间申请了一个为a的四字节的空间存放10,当程序走出a的作用域是申请的空间将无法访问只能再其作用域访问。
到这里我们可以认为局部变量的作用域就是他的生命周期;全局变量的作用域和生命周期是整个工程
3.4常量
#include<stdio.h>
int main()
{
4.14;//浮点型字面常量
5;//整型字面常量
//单独使用字面常量没有意义通常是这么使用的 int a=100;
return 0;
}
#include<stdio.h>
int main()
{
int a = 10;//局部变量
a = 200;
printf("%d\n", a);
return 0;
}
运行结果如下
这个代码的我们能够分析出a是个变量,那我如何让a不变呢如何让a还打印出10呢?
我们尝试加上const让他具有常属性
直接报错报错的原因是const int a=10 那么a就具有常数性就应该是10,而下面一行中又给a赋值200和之前常数性的10不同才会报错,所以说const定义的变量是常变量即具有常属性的变量。那他本质还是变量啊那我们该如何证明const修饰的变量本质还是变量呢?
这里我们引用数组的arr[]
代码如下:
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
return 0;
}
转存失败重新上传取消
正在上传…重新上传取消
我们发现这个代码是没有问题的接下来我们怎么做
#include<stdio.h>
int main()
{
int n = 10;
int arr[n] = { 0 };
return 0;
}
转存失败重新上传取消
正在上传…重新上传取消
是不是发现报错了因为arr[*]其中*为常量才行。
那接下来这里我定义了一个有常熟性的变量n且给他10这个值,我按F5发现
#include<stdio.h>
int main()
{
const int n = 10;
int arr[n] = { 0 };
return 0;
}
转存失败重新上传取消
正在上传…重新上传取消
会发现还是会报错而且报错的内容是n为整型所以呢虽然n被const修饰具有了常属性但是本质还是个变量
#define MAX 100
#include<stdio.h>
int main()
{
int a = MAX;
printf("%d\n", a);
return 0;
}
转存失败重新上传取消
正在上传…重新上传取消
但是如果我们强制将MAX转变就会报错如
#define MAX 100
#include<stdio.h>
int main()
{
int a = MAX;
MAX=200;
printf("%d\n", a);
return 0;
}
转存失败重新上传取消
正在上传…重新上传取消
运行结果报错的原因define 定义的MAX其实本质上就是个常量所以不能变
3.5枚举常量
生活中有很多东西是可以一一例举的你如性别:男性 ,女性,保密。再比如三原色:红,黄,蓝
#include<stdio.h>
enum sex
{
man,
woman,
secret
};
int main()
{
int a = man;
int b = woman;
int c = secret;
printf("%d\n%d\n%d\n", a, b, c);
return 0;
}
转存失败重新上传取消
正在上传…重新上传取消
看运行结果我们发现枚举常量得值都是从0开始依次往下的