(4)变量、常量
生活中有些值是不变的(比如:圆周率、性别(?)、身份证号号码、血型等);而有些值是可变的(比如:年龄、体重、薪资等)。
不变的值C语言中用常量的概念来表示,变化的值用变量来表示。
定义变量的方法:
举例——
int age=150;
float weight=45.5f;
char ch='W';
通过上面的例子,不难发现定义变量的方法是类型+变量名+赋一个值。
变量的形式:
1、局部变量
2、全局变量
那什么是局部变量?什么是全局变量?
举例——
int num2=20;//全局变量
int main(){
int num1=10;//局部变量
return 0;
}
补充一点:{ }大括号又叫“代码块”。
在代码块内部定义一个变量就叫局部变量;而在代码块之外定义的变量就叫全局变量;因此,区分全局和局部的变量的方法就看是否在代码块之内或之外。
引申一个问题——
全局变量和局部变量能否同时出现?
#include <stdio.h>
int global=2019;//全局变量
int main(){
int global=2018;//局部变量
printf("%d\n",global);
return 0;
}
通过代码测试,是是可以同时出现的,但打印的结果是局部变量的赋值数。
这里引出一个知识点:
当全局变量和局部变量的名字相同的情况下,如果我们再去使用这个变量,局部变量优先。
其结论——局部变量和全局变量的命名建议不要相同,相同容易产生误会,产生Bug。
但如果我们局部变量没有的话,就没有优不优先的问题,打印结果是全局变量。
int global=2018;//局部变量
int global=2020;//局部变量
如果局部变量的同名的话,会发生错误——global多次被初始化。
、
再提问——
局部变量和全局变量仅仅是放的位置不一样吗?
举例——
int a=10; ——全局变量在哪都可以使用(只要是在代码块之外)
int main(){
{
int a=10; ——这也算是局部变量[在大括号内部]
}
printf("%d\n",a);
return 0;
}
这个代码时无法打印的,因为变量a是在这个代码块(大括号)内部定义,是局部范围定义的,不能在这个范围之外使用,也就是打印不出来。
局部变量和全局变量使用范围也是有一定区别的。
变量的使用:
举例:计算两个数的和
(我们知道printf函数是用来打印的,这里介绍新函数——输入函数scanf)
int main(){
int num1=0;
int num2=0;
scanf("%d%d",&num1,&num2);
}
【 scanf("%d%d",&num1,&num2);中%d%d是指输入两个整数,&是特殊符号——取地址符号。】
通过之前所学,我们已知当我们写出int age=20;这个代码时, 其实是向内存申请4个字节的空间,
(用sizeof函数计算得出)
那内存里的4个字节怎么找呢?电脑大内存空间如何使用呢?
这里就涉及到编号和地址的知识了。
假设将int这4个字节编个号(如:1098102)有了这个编号,我们就能找到这个空间了,而这编号就相当于地址。
【注:这里的编号不是固定的,每次使用类型时会向内存申请随机的4个字节空间,所以编号也是随机的。】
语法规定:
&num1,&num2——&取地址符号可以把num1、num2取出来,意思是把输入的两个数字放在这两个地址处[&num1、&num2],即放在名为num1和num2的空间。
【注:如果这块不了解的话,请翻阅上一个知识点。】
再往后,就需要将这两个数相加——num1+num2
而相加之后的数就需要一个变量用来存储了,如:sum
写法:
int sum=0;
sum=num1+num2;
printf("sum=%d\n",sum);
int main() {
int num1 = 0;
int num2= 0;
scanf("%d%d", &num1, &num2);
int sum= 0;
sum = num1 + num2;
printf("sum=%d\n", sum);
return 0;
}
如果是用旧版本的vs的同学,可以去尝试敲这个代码,会报错——语法错误:缺少“;”(在“类型”的前面),这是一个无脑的错误。
这个代码在C++中可以运行,但在C语言中要统一放在前面。
C++中支持说哪里需要代码哪里定义,但在C语言语法中规定,变量要定义在当前代码块内部的最前面。
【注:新版本的vs中并不会出现这个错误,可能是vs支持了最新的c标准,但还是建议大家把定义变量放在最前面,这样能美观代码。】
正确的写法:
插曲:
细心的同学会发现,我这边在写输入函数时,我是用scanf_s,而非scanf;
当我们在使用"scanf"的时候会出现警告,告诉我们尽量不要去使用,而是去使用“scan_s”这个函数。
这个代码如果在vs2010版本是可以打印出来(调试成功)的,但在其他版本(尤其是新版本)会显示错误。
错误: '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.
这个意思是分不清“scanf”是函数还是变量?
但这里不推荐用vs提供的,因为各编译器不同,可能不承认,当我们用了某个平台独立提供的某个接口/函数的时候,那可能在其他平台不被承认。(不具有跨平台性/可移植性)
比如:在gcc编译器中就不承认“scanf_s”
【注:scanf是C语言提供的,scanf_s是vs编译器提供的】
这里推荐使用C语言所提供的。
改进方法:
在错误报告中,使用所提供的修正方案。
在源文件第一行加入“#define _CRT_SECURE_NO_WARNINGS 1”即可。
C语言所提供的库函数:
scanf
strcpy
strlen
strcat
.......
这些都是会被当作“不安全的”(具体原因后续再分析),解决方法如上同,也可以使用平台所提供的,但这样不具有跨平台性/兼容性。
但如果每次都要在写代码知道时候,添加这一段话,就会很费尽。
解决方法:默认第一行带有这句话。
如何设置?(按以下步骤来)
1、找到vs安装路径(右击vs软件点属性可找到目标)
即:菜单——vs2022快捷方式——打开文件所在位置——右击vs2022点属性——根据目标找到文件位置,之后一步步进到IDE文件内——点VC——在点进vcprojectltems(路径寻找方法)
2、找到“new++file”这个文件,打开方式选择记事本——保存“#define _CRT_SECURE_NO_WARNINGS 1”即可——但可能无效
解决方案:右键——属性——安全——高级——更改权限——选中users主体——禁用继承——弹出的窗口点第一个——点编辑——把完全控制勾上——保存退出即可,然后在试一次(win11更简便)
变量的使用——哪里用,什么时候用,我们就去定义。