做一个默默无私奉献的程序猿

C语言的常量、变量及作用域

2017-11-02  本文已影响37人  长风留言

谨记

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

目标:学习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语言中使用变量采用先定义、后使用的规则,任何变量在使用前必须先进行定义。

变量定义的基本形式如下:
说明符(一个或多个) 变量或表达式列表
这里的说明符就是包含一些用于表明变量基本类型的关键字、存储类型和作用域。表格革举了一些常见基本数据类型变量的定义方式。

通常,变量在定义时也可以将其初始化,如:
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 <stdio.h>
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 <stdio.h>
/*定义全局变量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 <stdio.h>
    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函数的用法,希望读者下去认真深刻的体会,学会举一反三。

结尾

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

上一篇 下一篇

猜你喜欢

热点阅读