说明:我是一个初学c语言的小白,很多地方都不是很理解,所以就会自己动手敲代码进行相应的推理验证,希望可爱的你在看到这些步骤时,不要嫌弃我啰嗦。(比如吐槽:这作者咋这样呀,这么简单的还要敲代码验证,真菜呀!…我:好吧,我不装了,我摊牌了,我确实菜,真的菜,咋滴啦,还不允许初学者菜呀!)
#include
int main()
{
printf("hello world!\n");
return 0;
}
//所有的c语言程序都有相同的一个框架
int main()
{
//这里是程序执行的具体内容
return 0;
}
int 表示整型,跟后面return 0相呼应。
main()是我们的一个主函数,所有程序有且仅有一个主函数,如果不满足这个条件的时候,代码运行就会报错。
printf指的是打印函数, print(打印)f-- - function(函数),这个是c语言库函数中的一个函数,在stdio中,不在当前所写的函数里面,所以需要#include
结果展示:说明:vs2019中多了文件路径的这句话
我们生活中有很多不同类型的数据,比如年龄22岁,身高171.33cm,名字“小明”等等,要记录不同类型的数据,我们就需要不同的数据类型的变量来向内存申请空间。例如:
int age = 22;
char ch = ‘A’;
float height = 171.33;
double weight = 145.11;
常用的数据类型有7种:char / int / short / long / long long / float / double
打印输出不同类型的变量需要用到不同的转义字符
例如打印
char类型的常用------ % c 字符类型 % s 字符串类型
int\short\long\long long ------ % d 整型十进制
float ------ % f 单精度浮点型十进制
double ------ % lf 双精度浮点型十进制
% p-- - 以地址的形式打印
不同的数据类型所占用的内存空间是不一样的,这也是为什么整型有int / short / long / long long 之分,合理的使用不同类型,可以节省内存空间。我们可以使用sizeof(数据类型); 来计算每种类型的空间大小。
sizeof本质是一种单目操作符,不是函数,所以不需要额外引用头文件。
#include
int main()
{
char ch;
int a;
short b;
long c;
long long d;
float f;
double lf;
printf("Length of char:%d\n", sizeof(char));
printf("Length of int:%d\n", sizeof(int));
printf("Length of short:%d\n", sizeof(short));
printf("Length of long:%d\n", sizeof(long));
printf("Length of long long:%d\n", sizeof(long long));
printf("Length of float:%d\n", sizeof(float));
printf("Length of double:%d\n", sizeof(double));
printf("Length of &char:%d\n", sizeof(&ch));
printf("Length of &int:%d\n", sizeof(&a));
printf("Length of &short:%d\n", sizeof(&b));
printf("Length of &long:%d\n", sizeof(&c));
printf("Length of &long long:%d\n", sizeof(&d));
printf("Length of &float:%d\n", sizeof(&f));
printf("Length of &double:%d\n", sizeof(&lf));
return 0;
}
结果展示:
通过这个结果我们可以看到:
计算机是硬件-- - 通电 正电 1 负电 0
计算机中的存储单位
bit-- - 比特位 1
byte-- - 字节 = 8bit 10000001
kb-- - 千字节 = 1024byte
mb-- - 兆字节 = 1024kb
gb-- - 吉字节 = 1024mb
tb-- - 太字节 = 1024gb
pb-- - 拍字节 = 1024tb
生活中有一些值是不变的,比如圆周率,性别,血型,身份证号
有些值则是可变的,比如年龄,体重,薪资,时间等
不变的值,c语言用常量来描述,变化的值,用变量来描述。
①变量定义的方式:类型 变量名 = 初始值; 例如:
int age = 24;
char ch = 'A';
float height = 176.14;
②变量的类型:局部变量、全局变量
int num1 = 20;//全局变量,定义在代码块({})之外的变量
int main()
{
int num2 = 10;//局部变量,定义在代码块({})之内的变量
return 0;
}
③当局部变量与全局变量名称相同的时候,局部变量优先
#include
int a = 100;
int main()
{
int a = 10;
printf("%d\n", a);
return 0;
}
#include
int a = 100;
int main()
{
//int a = 10;//局部变量与全局变量名称相同时,局部变量优先
printf("%d\n", a);
return 0;
}
下面再看这个例子:
将printf函数放到{}里面去
提示:main函数内部的变量一定是局部变量,但局部变量的作用范围不一定是main函数内部,而是局部变量所在的局部区域。
④变量的使用
计算两个数的和 num1 num2,从键盘输入接收数值,求和后打印出来,具体代码如下:
我们看到这时候代码运行报错,这时候别着急,这个跟c语言使用方式有关,c语言语法规定,变量要定义在当前代码块的最前面。调整后我们可以得到:
出现了一个新的错误,描述scanf函数unsafe,这个时候我们在头文件上方添加#define _CRT_SECURE_NO_WARNINGS 1 即可解决这个问题。(后面这个问题会单独出一篇文章分析讲解)
⑤变量的作用域和生命周期
作用域:程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效 / 可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域
简单来说:变量起作用的范围就是其作用域。
1)局部变量的作用域是变量所在的局部范围
2)全局变量的作用域是整个工程。
例如:num1 起作用的范围就是{ } 的范围,printf函数在这个函数内,所以可以正常打印输出。
如果num1的位置发生变化,放到小括号{}中,其作用域为黄框范围,此时printf函数在作用域之外,不能正常进行打印输出。
全局变量的作用域整个工程
1)同.c源文件中
2)不同.c源文件中,用extern来声明外部变量
生命周期:变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段。
(变量什么时候存在、什么时候销毁、什么时候结束、什么时候起作用)
1)局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
2)全局变量的生命周期是:整个程序的生命周期。
scanf()函数不安全的原因分析
int main()
{
char arr[5] = {
0 };
scanf("%s", arr);
printf("%s \n", arr);
return 0;
}
这里定义的是一个包含5个字符的数组,通过键盘输入,运用scanf函数输入的时候,我们可以输入并打印出超过5个字符的数组,栈空间被破坏了,数组就越界访问了,这个时候就会报error错误。
scanf读取的时候没有考虑到数组的实际大小,不管输入的内容数组是否放不放的下。