C 作用域规则

任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问。C 语言中有三个地方可以声明变量:

  1. 在函数或块内部的局部变量
  2. 在所有函数外部的全局变量
  3. 在形式参数的函数参数定义中

让我们来看看什么是局部变量、全局变量和形式参数。

局部变量

在某个函数或块的内部声明的变量称为局部变量。它们只能被该函数或该代码块内部的语句使用。局部变量在函数外部是不可知的。下面是使用局部变量的实例。在这里,所有的变量 a、b 和 c 是 main() 函数的局部变量。

实例

#include <stdio.h>

int main ()
{
/* 局部变量声明 */
int a, b;
int c; /* 实际初始化 */
a = ;
b = ;
c = a + b; printf ("value of a = %d, b = %d and c = %d\n", a, b, c); return ;
}

全局变量

全局变量是定义在函数外部,通常是在程序的顶部。全局变量在整个程序生命周期内都是有效的,在任意的函数内部能访问全局变量。

全局变量可以被任何函数访问。也就是说,全局变量在声明后整个程序中都是可用的。下面是使用全局变量和局部变量的实例:

实例

#include <stdio.h>

/* 全局变量声明 */
int g; int main ()
{
/* 局部变量声明 */
int a, b; /* 实际初始化 */
a = ;
b = ;
g = a + b; printf ("value of a = %d, b = %d and g = %d\n", a, b, g); return ;
}

在程序中,局部变量和全局变量的名称可以相同,但是在函数内,局部变量的值会覆盖全局变量的值。下面是一个实例:

实例

#include <stdio.h>

/* 全局变量声明 */
int g = ; int main ()
{
/* 局部变量声明 */
int g = ; printf ("value of g = %d\n", g); return ;
}

当上面的代码被编译和执行时,它会产生下列结果:

value of g = 

形式参数

函数的参数,形式参数,被当作该函数内的局部变量,它们会优先覆盖全局变量。下面是一个实例:

实例

#include <stdio.h>

/* 全局变量声明 */
int a = ; int main ()
{
/* 在主函数中的局部变量声明 */
int a = ;
int b = ;
int c = ;
int sum(int, int); printf ("value of a in main() = %d\n", a);
c = sum( a, b);
printf ("value of c in main() = %d\n", c); return ;
} /* 添加两个整数的函数 */
int sum(int a, int b)
{
printf ("value of a in sum() = %d\n", a);
printf ("value of b in sum() = %d\n", b); return a + b;
}

当上面的代码被编译和执行时,它会产生下列结果:

value of a in main() =
value of a in sum() =
value of b in sum() =
value of c in main() =

初始化局部变量和全局变量

当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。定义全局变量时,系统会自动对其初始化,如下所示:

数据类型 初始化默认值
int 0
char '\0'
float 0
double 0
pointer NULL

正确地初始化变量是一个良好的编程习惯,否则有时候程序可能会产生意想不到的结果,因为未初始化的变量会导致一些在内存位置中已经可用的垃圾值。

笔记列表

 
  1. C 的形参与实参

    在 C 语言中,形参与实参虽然很简单,但是,是大家比较容易混淆的一个点,这里将为大家详细的讲解。

    概念:从字面上理解,所谓形式参数即只只是声明了一个作为参数的变量,并未直接进行赋值使用,而实际参数则相反。

    如下例

    #include <stdio.h>
    
    int test(int,int); // 形参,只声明
    
    int main()
    {
    int a,b;
    printf("%d",test(,)); // 实参,已赋值
    } int test(int a,int b) // 形参
    {
    a=a+b;
    return a;
    }

    像上面在 test() 函数里只声明了最为参数的变量,而 main() 函数里则对它赋了值。

C 作用域规则的更多相关文章

  1. C语言的作用域规则

    作用域规则 程序中名字的作用域,通俗的讲,就是这个名字在程序中的使用范围.在C语言中,作用域的规则相对比较简单,主要分为 全局作用域 和 局部作用域 两种. 一个变量如果定义在函数中,那么这个变量的作 ...

  2. 【C语言入门教程】5.2 函数的作用域规则(auto, static)

    作用域规则是指代码或数据的有效使用范围.C语言将函数作为独立的代码块,函数之间不能相互访问其内部的代码或数据.函数间数据的传递只能通过接口实现.但是,变量的定义方法可改变函数的作用域规则,可将变量分为 ...

  3. C语言函数的作用域规则

      “语言的作用域规则”是一组确定一部分代码是否“可见”或可访问另一部分代码和数据的规则. “同一函数中,不同的结构体成员名能相同,当变量处于不同的作用域时,名称可以相同. 注:作用域,其对象是变量, ...

  4. python3的变量作用域规则和nonlocal关键字

    也许你已经觉得自己可以熟练使用python并能胜任许多开发任务,所以这篇文章是在浪费你的时间.不过别着急,我们先从一个例子开始: i = 0 def f(): print(i) i += 1 prin ...

  5. Python函数的作用域规则和闭包

    作用域规则 命名空间是从名称到对象的映射,Python中主要是通过字典实现的,主要有以下几个命名空间: 内置命名空间,包含一些内置函数和内置异常的名称,在Python解释器启动时创建,一直保存到解释器 ...

  6. jmeter执行顺序及作用域规则

    1.执行顺序 配置元件 前置处理器 定时器 采样器 后置处理器 断言 监听器 备注: 服务器响应为空的话后三个不执行 作用域内存在采样器时定时器.断言.前置/后置处理器才执行 逻辑控制器和采样器按照在 ...

  7. C语言基础知识【作用域规则】

    C 作用域规则1.任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问.C 语言中有三个地方可以声明变量:在函数或块内部的局部变量在所有函数外部的全局变量在形式参数的函数参 ...

  8. python tips:最内嵌套作用域规则,闭包与装饰器

    在作用域与名字空间提到,python是静态作用域,变量定义的位置决定了变量作用的范围.变量沿着local,global,builtins的路径搜索,直觉上就是从里到外搜索变量,这称为最内嵌套作用域规则 ...

  9. 【你不知道的javaScript 上卷 笔记2】 javaScript 的作用域规则

    一.什么是词法作用域? 词法作用域是在定义词法阶段的作用域,就是由代码变量和作用域块写在哪里决定的,基本上词法分析器在处理代码时会保持作用域不变. 二.词法作用域特点 完全由写代码期间函数所声明的位置 ...

随机推荐

  1. ZigBee学习一 任务处理函数_ProcessEvent

    ZigBee学习一 任务处理函数_ProcessEvent //任务处理函数UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events ){ ...

  2. 如何理解显示卡的驱动模块(DDX,DRM,DRI,XVMC)

    如何理解显示卡的驱动模块(DDX,DRM,DRI,XVMC) 1)DDX是什么 DDX是X服务器的2D驱动模块,例如via_drv.so. 2D的显示加速,包括xvideo也是由它负责. 它会初始化硬 ...

  3. springboot开启定时任务 添加定时任务 推送

    最近在自学Java的springboot框架,要用到定时推送消息.参考了网上的教程,自己调试,终于调好了.下面将网上的教程归纳下,总结复习下.  springboot开启定时任务  在SpringBo ...

  4. Java EE 学习(9):IDEA + maven + spring 搭建 web(5)- 博客文章管理

    转载:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) . 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) Jav ...

  5. ToolTip特效 JavaScript 盗取厦门人才网的特效

    原文发布时间为:2009-05-17 -- 来源于本人的百度文章 [由搬家工具导入] 源代码:http://www.xmaspx.com/Services/FileAttachment.ashx?At ...

  6. 【shell】Shell命令合集(0)

    Ccat zdd 浏览文件zdd的内容cat zdd1 zdd2 浏览多个文件的内容cat -n zdd浏览文件zdd的内容并显示行号 cd 回到起始目录,也即刚登陆到系统的目录,cd后面无参数cd ...

  7. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---27

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  8. C#图解教程学习笔记——接口

    一.接口概念接口是指定一组函数成员而不实现它们的引用类型.所以只能类和结构来实现接口. 二.声明接口1. 接口声明不能包含:数据成员.静态成员,只能包含以下类型的非静态成员函数:方法.属性.事件.索引 ...

  9. 多线程中sleep和wait的区别

    前几天去UC笔试,有一道简答题问到了.之前还真一直没留意到这个问题,所以答得也不好. 无论学习什么都好,通过对比学习更有利于发现事物的共性和个性,对于知识点的理解更有明显效果(这也可能是UC笔试题上, ...

  10. PostMan的在线安装和简单使用

    Postman是一款很流行的WEB接口测试工具,因其强大的功能及清新的界面,赢得许多测试及开发者的喜爱.   1.PostMan的在线安装 因google退出中国,使得chrome上的扩展插件无法在线 ...