c语言中常量有何作用,C语言的常量、变量及作用域

谨记

当你感觉累的时候,说明你还活着,当你突然感觉不到的累那一刻,也就意味着你已经被社会淘汰了,人活着就的受累,因为:活着就是为了改变世界。

目标:学习C语言的变量、常量及作用域等

通过这篇文章,你将了解到C语言中有关常量、变量、作用域等知识点,本篇文章将结合程序进行一个展示,当然也同样希望读者能自行举一反三。

常量

1.const定义常量

在C语言中,可以使用const来定义一个常量。只需在变量名前加上const即可。

int const a;

以上语句定义了a为一个整数常量。那么,既然a的值不能被修改,如何让a拥有一个值呢?

这里,一般有两种方法,其一是在定义时对它进行初始化,如下所示。

int const a = 100;

其二,在函数中声明为const的形参在函数被调用时会得到实参的值。

在这里需要着重讲解的是const涉及指针变量的情况,先看两个const定义。

const int *a;

int * const a;

在第一条语句中,const用来修饰指针a所指向的对象,也就是说我们无法通过指针a来修改其指向的对象的值。但是a这个指针本身的值(地址)是可以改变的,即可以指向其他对象。与此相反,在第二条语句中,const修饰的是指针a。因此,该指针本身(地址)的值是不可改变的,而该指针所指向的对象的值是可以改变的。(如果指针不明白的,暂时记着就行,后面会详细讲解指针)。

2.define定义常量

define实际是一个预处理指令,其实际的用途远大于定义常量这一功能。在这里,首先讲解define定义常量的基本用法,对于其他用途在的后续文章中会有详细介绍。

使用define定义常量实际是进行符号替换,其定义方法为

#define 符号名 替换列表

符号名必须符合标识符命名规则。替换列表可以是任意字符序列,如数字、字符、字符串、表达式等,例如:

#define MSG "I'm Antigloss!" /*后面的所有MSG都会被替换为“I'm Antigloss!”*/

#define SUM 99 /*后面的所有SUM都会被替换为99*/

#define BEEP "\a" /*后面的所有BEEP都会被替换为“\a”*/

习惯上,人们用大写字母来命名符号名,而用小写字母来命名变量。

注意:在使用#define的时候,要千万注意最后面是没有“;”的,初学者写代码习惯在每句代码后面都加“;”,所以这里要小心。

变量

在上一篇文章中,读者学习了C语言中的基本数据类型。那么在程序中不同数据类型的变量如何使用呢?在C语言中使用变量采用先定义、后使用的规则,任何变量在使用前必须先进行定义。

变量定义的基本形式如下:

说明符(一个或多个) 变量或表达式列表

这里的说明符就是包含一些用于表明变量基本类型的关键字、存储类型和作用域。表格革举了一些常见基本数据类型变量的定义方式。

b80c7b31867f

通常,变量在定义时也可以将其初始化,如:

int i = 5;

这条语句实际上转化为两条语句:

int i; /定义/

i = 5; /初始化/

此外,指针的定义形式在这里需着重说明。

指针的定义形式为标识符加上“”。有些读者习惯把“”写在靠近数据类型的一侧,如:

int* a;

虽然编译器支持这种定义形式,但会在阅读代码时带来困扰,例如:

int* b, c, d;

读者会很自然地认为上面这条语句把3个变量都定义为指向整型的指针。事实上,只有变量b是整型指针,而c、d都是整型变量。因此,建议读者在定义指针变量时将“*”写在靠近变量名的一侧,如下所示。

int *b, *c, *d;

友情提示:

关于变量的定义和变量的声明是两个极易混淆的概念,在形式上也很接近。在对变量进行了定义后,存储器需要为其分配一定的存储空间,一个变量在其作用域范围内只能有一个定义。而变量的声明则不同,一个变量可以有多次声明,且存储器不会为其分配存储空间。在本书的稍后部分将会讲解它们使用上的区别。

作用域

变量的作用域定义:程序中可以访问一个指示符的一个或多个区域,即变量出现的有效区域,决定了程序的哪些部分通过变量名来访问变量。一个变量根据其作用域的范围可以分为函数原型作用域、局部变量和全局变量。

1.函数原型作用域

函数原型中的参数,其作用域始于"(",结束于")"。

设有下列原型声明:

double Area(double radius);

radius 的作用域仅在于此,不能用于程序正文其他地方,因而可以省略。

2.局部变量

在函数内部定义的变量称为局部变量。局部变量仅能被定义该变量的模块内部的语句所访问。换言之,局部变量在自己的代码模块之外是不可见的。

对于局部变量,要了解的重要规则是,它们仅存在于定义该变量的执行代码块中,即局部变量在进入模块时生成(压入堆栈),在退出模块时消亡(弹出堆栈)。定义局部变量的最常见的代码块是函数,代码如下:

/*在函数体类声明变量*/

void function1(){

int x = 10;

}

void function2 (){

int x;

x = 100;

}

整数变量x被定义了两次,一次在function1中,另一次在function2中。function1和function中的x互不相关,原因是每个x作为局部变量仅在被定义的模块内可见。

3.全局变量

与局部变量不同,全局变量贯穿整个程序,它的作用域为源文件,可被源文件中的任何一个函数使用。它们在整个程序执行期间保持有效。示例代码:

#include

int a,b;//全局变量

void function (){

}

float x,y;

void function2 (){

}

int main(int argc, const char * argv[]) {

return 0;

}

得出结论:从上例可以看出a、b、x、y都是在函数外部定义的外部变量,都是全局变量。x、y定义在函数function1之后,在function1内没有对x、y的声明,所以它们在function1内无效。a、b定义在源程序最前面,即所有函数之前,因此在function1、function2及main内不加声明就可使用。

可以看到,使用全局变量可以有效地建立起几个函数相互之间的联系。对于全局变量还有以下几点说明。

① 对于局部变量的定义和声明,可以不加区分,而对于全局变量则不然。全局变量的定义和全局变量的声明并不是一回事,全局变量定义必须在所有的函数之外,且只能定义一次,其一般形式为

[extern] 类型说明符 变量名,变量名……

其中方括号内的extern可以省去不写,例如:

int a,b;

等效于:

extern int a,b;

而全局变量声明出现在要使用该变量的各个函数内。在整个程序内,可能出现多次。全局变量声明的一般形式为

extern 类型说明符 变量名,变量名……

全局变量在定义时就已分配了内存单元,并且可做初始赋值。全局变量声明不能再赋初始值,只是表明在函数内要使用某外部变量。

② 外部变量可加强函数模块之间的数据联系,但是又使函数要依赖这些变量,因而使得函数的独立性降低。从模块化程序设计的观点来看这是不利的,因此在不必要时尽量不要使用全局变量。

③ 全局变量的内存分配是在编译过程中完成的,它在程序的全部执行过程中都要占用存储空间,而不是仅在需要时才开辟存储空间。

④ 在同一源文件中,允许全局变量和局部变量同名。在局部变量的作用域内,全局变量不起作用。因此,若在该函数中想要使用全局变量,则不能再定义一个同名的局部变量。

#include

/*定义全局变量i并赋初值为5*/

int i = 5;

int main()

{

/*定义局部变量i,并未赋初值,i的值不确定,由编译器自行给出*/

int i;

/*打印出i的值,查看在此处的i是全局变量还是局部变量*/

if(i != 5)

printf ("it is local\n");

printf ("i is %d\n",i);

return 0;

}

运行结果:it is local

i is 134518324Program ended with exit code: 0

可以看到,i的值并不是全局变量所赋的初值,而是局部变量的值。

⑤ 全局变量的作用域可以通过关键字extern扩展到整个文件或其它文件。

补充:printf 和 scanf

printf就是一个输出函数,把输出结果打印到控制台上,

scanf函数就是用来接收用户输入的内容,可以是字符,字符串、数字等类型。

我们来看一个示例吧:

#include

int main(int argc, const char * argv[]) {

int a;//声明一个变量

int b;

printf("请输入两个数");

scanf("%d\n%d",&a,&b);//用scanf函数接受用户输入的a,b,这里用了&这个符号,这个符号是取地址符的意思,相当于通过指针给a和b赋值。

int sum;

sum = a + b;//求和

printf("a = %d\nb = %d\nsum = %d",a,b,sum);//打印输出

return 0;

}

输出结果:

请输入两个数

2

4

a = 2

b = 4

sum = 6Program ended with exit code: 0

总结

本篇文章向读者介绍了C语言中如何定义一个变量和常量,以及介绍了作用域的相关知识,补充说明了printf和scanf函数的用法,希望读者下去认真深刻的体会,学会举一反三。

结尾

最后,希望读者在读文章的时候发现有错误或者不好的地方,欢迎留言,我会及时更改,感谢你的阅读和评论已经点赞收藏。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值