ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

计算机科学类专升本复习之“C语言变量的作用域”详解(初稿)

2022-02-03 16:03:32  阅读:137  来源: 互联网

标签:main 函数 作用域 C语言 int 专升本 全局变量 变量


C语言变量的作用域,加深对全局变量和局部变量的理解

作用域是什么?

    所谓的作用域就是变量的"有效范围",就是变量可以在哪个范围内使用。

有些变量可以在"所有"代码中使用,有些变量只能在"当前"的文件中使用,有些变量只能在"函数内部"使用,有些变量只能在"for循环"内部使用。

变量的作用有取决于什么?

    变量的作用域由"变量的定义位置决定",在不同位置定义的变量,它的作用域是不一样的。

本次我们只讲解两种变量,一种是只能在"函数内部"使用的变量,另外一种是可以在"所有"代码文件中使用的变量。

一、在函数内部定义的变量(局部变量)

在函数内部定义的变量,它的作用域也仅限于函数内部,当然拉出了函数它就不能使用吗。这样的变量我们称它为"局部变量"。

函数的"形参"也是局部变量,也只能在函数内部使用。

//为了让大家更易理解,我们举个程序例子吧:

#include<stdio.h>

int kk(int m,int n)  

{

    int i,sum=0; //这边说明一下  变量: m、n、i、sum都是局部变量,只能在kk()内部使用!

    for(i=m;i<=n;i++)

    {

        sum += i;

    }

    return sum;

}



int main()

{

    int a = 5,b = 66; //a、b、result 也都是局部变量,只能在main()内部使用

    int result = kk(a,b); //这步操作是将 a、b实参 传送到 kk()中的形参

    printf("The sum from %d to %d is %d\n",a,b,result);

    return 0;

}

结果:

The sum from 5 to 66 is 2201

对局部变量的两点说明:

main() 也是一个函数,在 main() 内部定义的变量也是局部变量,只能在 main() 函数内部使用。

形参也是局部变量,将实参传递给形参的过程,就是用实参给局部变量赋值的过程,它和a=b; sum=m+n;这样的赋值没有什么区别。

二、在所有函数外部定义的变量(全局变量)

C语言允许在所有函数的外部定义变量,这样的变量成为"全局变量"

    全局变量的作用域默认为"整个程序",也就是所有"代码文件",包括"源文件(.c文件)和头文件(.h文化)"。

如果在给"全局变量"加上"static关键字",它的"作用域"就变成"当前文件",在其他文件中就无效了。

这是为什么呢?

因为static是静态局部变量,被他声明后只能用于本文件!

eg 定义一个函数,根据长方体的 长宽高 求 它的体积以及三个面积。

#include<stdio.h>

int s1 = 0,s2 = 0,s3 = 0; //定义三个全局变量,分别表示 三个面的面积



int vs(int length, int width, int height)

{

    int v;//定义体积变量v

    v = length * width * height;

    s1 = length * width;

    s2 = width * height;

    s3 = length * height;

    return v;

}



int main()

{

    int v = 0;

    v = vs(15,20,30);

    printf("v=%d,s1=%d,s2=%d,s3=%d\n",v,s1,s2,s3);

    v = vs(5,17,8);

    printf("v=%d,s1=%d s2=%d,s3=%d\n",v,s1,s2,s3);

    return 0;

}

结果:

v=9000,s1=300,s2=600,s3=450

v=680,s1=85 s2=136,s3=40

根据题意,我们希望借助一个函数得到四份数据:体积 v 以及三个面的面积 s1、s2、s3。遗憾的是,C语言中的函数只能有一个返回值,我们只能将其中的一份数据(也就是体积 v)放到返回值中,其它三份数据(也就是面积 s1、s2、s3)只能保存到全局变量中。

C语言代码从前往后依次执行,变量在使用之前必须定义或者声明,全局变量 s1、s2、s3 定义在程序开头,所以在 vs() 和 main() 中都有效。

vs() 中将求得的面积放到 s1、s2、s3 中,在 main() 中能够顺利取得它们的值,这说明:在一个函数内部修改全局变量的值会影响其它函数,全局变量的值在函数内部被修改后并不会自动恢复,它会一直保留该值,直到下次被修改。

全局变量也是变量,变量只能保存一份数据,一旦数据被修改了,原来的数据就被冲刷掉了,再也无法恢复了,所以不管是全局变量还是局部变量,一旦它的值被修改,这种影响都会一直持续下去,直到再次被修改。

三、关于变量的命名

每一段可运行的C语言代码都包含了多个作用域,即使最简单的C语言代码也是如此。

int main(){

    return 0;

}

这就是最简单的、可运行的C语言代码,它包含了两个作用域,一个是 main() 函数内部的局部作用域,一个是 main() 函数外部的全局作用域。

C语言规定,在同一个"作用域"中不能出现两个"名字相同的变量",否则会产生"命名冲突",但是在"不同的作用域中",允许出现"名字相同的变量",因为它们"作用域范围不同",彼此之间不会产生冲突。

这句话有两层含义:

1. 不同函数内部可以出现"同名的变量",不同函数是不同的局部作用域。

2. 函数内部和函数外部可以出现同名的变量,"函数内部"是局部作用域,"函数外部"是全局作用域。

1. 不同函数内部的"同名"变量是两个完全独立的变量,它们彼此没有任何关联,也不会相互影响。

具体如下代码所示:

#include<stdio.h>

int kang1()

{

    int n = 100;

    printf("kang1:n = %d\n",n);

    n = 86;

    printf("kang1: n = %d\n",n);

}

int kang2()

{

    int n =29;

    printf("kang2: n = %d\n",n);

    kang1();    //调用kang1(),这边会输出kang1()中的两个结果

    printf("kang2: n = %d\n",n);   //输出的依就是kang2()中的n的值,因为它们互不影响

}

int main()

{

    kang2();

    return 0;

}

结果:

kang2: n = 29

kang1:n = 100

kang1: n = 86

kang2: n = 29

kang1() 和 kang2() 内部都定义了一个变量 n。

在 kang2() 中,n 的初始值是 29,调用 kang1() 后,n 值还是 29。

这说明 kang2() 内部的 n 并没有影响  kang1() 内部的 n。

这两个 n 是"完全不同的变量",彼此之间根本“不认识”,只是起了个相同的名字而已,这就好像明星撞衫,北京和云南都有叫李红的,赶巧了而已。


 

2. "函数内部"的局部变量和"函数外部"的全局变量"同名"时,在当前函数这个"局部作用域中","全局变量"会被“屏蔽”,不在起作用。

也就是说函数在"函数内部"使用的是"局部变量"而不是全局变量。

变量的使用遵循就近原则,如果在当前的局部作用域中找到了同名变量,就不会再去更大的全局作用域中查找。

另外,只能从小的作用域向大的作用域中去寻找变量,而不能反过来,使用更小的作用域中的变量。

下面我们通过一个具体的例子来说明:

#include <stdio.h>

int n = 10;  //全局变量

void func1(){

    int n = 20;  //局部变量

    printf("func1 n: %d\n", n);

}

void func2(int n){

    printf("func2 n: %d\n", n);

}

void func3(){

    printf("func3 n: %d\n", n);

}

int main(){

    int n = 30;  //局部变量

    func1();

    func2(n);

    func3();

    printf("main n: %d\n", n);

   

    return 0;

}

结果:

func1 n: 20

func2 n: 30

func3 n: 10

main n: 30

代码中虽然定义了多个同名变量 n,但它们的作用域不同,所有不会产生命名冲突。、

下面是对输出结果的分析

1. 对于 func1(),输出结果为 20,显然使用的是 func1() 内部的 n,而不是外部的 n。

2. 调用 func2() 时,会把 main() 中的实参 n 传递给 func2() 中的形参 n,此时形参 n 的值变为 30。形参 n 也是局部变量,所以就使用它了。

3. func3() 输出 10,使用的是全局变量,因为在 func3() 中不存在局部变量 n,所以编译器只能到函数外部,也就是全局作用域中去寻找变量 n。

4. main() 中 printf() 语句输出 30,说明使用的是 main() 中的 n,而不是外部的 n。

标签:main,函数,作用域,C语言,int,专升本,全局变量,变量
来源: https://blog.csdn.net/weixin_51563198/article/details/122776450

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有