初识C语言四(1)

本文介绍了C语言中变量和常量的概念,以及它们在编程中的应用。变量用于表示可变的值,如年龄和体重,常量表示不变的值,如圆周率。变量分为局部变量和全局变量,前者在代码块内部定义,后者在整个程序中可用。局部变量优先于同名全局变量。文章还讨论了变量的内存分配、地址和scanf函数的使用,以及不同编译器对安全函数的处理差异,强调了跨平台性和代码规范的重要性。
摘要由CSDN通过智能技术生成

(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更简便)

变量的使用——哪里用,什么时候用,我们就去定义。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值