[C][变量作用域]语句块
概述
C语言作用域有点类似于链式结构,就是下层能访问上层声明的变量,但是上层则不能访问下层声明的变量;
#include <stdio.h>
#define TRUE 1 int main(void)
{
if (TRUE)
{
int x = ;
if (TRUE)
{
printf("%d\n", x);\\output: 2
}
}
}
就像上述例子,第二个if语句块是可以访问到第一个if语句块中声明的变量x的;
C语言一般把变量作用域归结为4个:
1.文件作用域;
2.语句块作用域(所有大括号的语句块,如if/for/while等);
3.函数原型作用域;
4.函数作用域;
当当前层声明了一个跟上层标识符和命名空间一模一样的变量时,当前层的行为是隐藏上层的声明,启用当前层的声明,而当代码返回上层,则继续沿用上层生效的声明:
#include <stdio.h>
#define TRUE 1 int main(void)
{
if (TRUE)
{
int x = ;
if (TRUE)
{
int x = ;
printf("%d\n", x);\\output: 3
}
printf("%d\n", x);\\output: 2
}
}
当不带类型声明符时,当前层可以访问包括改变上层的变量:
#include <stdio.h>
#define TRUE 1 int main(void)
{
if (TRUE)
{
int x = ;
if (TRUE)
{
x = ;
printf("%d\n", x);//output: 2
}
printf("%d\n", x);//output: 2
}
}
又例如调用函数改变:
#include <stdio.h>
#define TRUE 1 int x = ;
void chx(void); int main()
{ chx();
if (TRUE) {
printf("%d\n", x);//output: 3
}
} void chx(void)
{
x = ;
}
对于extern外部变量,规则也是适用的:
/*file a.c*/
int x = ;
/*file b.c*/
#include <stdio.h>
#define TRUE 1 extern x;
void chx(void); int main()
{
printf("%d\n", x);\\output:
chx();
if (TRUE) {
printf("%d\n", x);\\output:
}
} void chx(void)
{
x = ;
}
以上两个规则对于4个变量作用域都有效,整个结构类似于这样:

[C][变量作用域]语句块的更多相关文章
- VS插件开发——格式化变量定义语句块
插件介绍 代码地址:https://github.com/sun2043430/vs2008_format_variable_define_plugin/ 在vs里,对选中的变量定义块进行格式化,效果 ...
- C语言变量声明问题——变量定义一定要放在所有执行语句/语句块的最前面吗?
报错信息:error C2065: 'salary' : undeclared identifier #include <stdio.h> void main(){ printf(&quo ...
- JavaScript 学习-变量的作用域和块级作用域
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- python基础----函数的定义和调用、return语句、变量作用域、传参、函数嵌套、函数对象、闭包、递归函数
1.函数的定义: 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可 ...
- Flask07 Jinja2模板测试器、控制语句IF/FOR、变量/块 赋值、作用域、块级作用域
1 测试器及其使用 在模板中的 {{}} 可以书写测试器,格式如下 {{ 变量 is 测试器名称 }} 1.1 在python中导入 Jinja2 的模板 from jinja2 import te ...
- 黑马程序员-- C语言变量作用域与代码块
这里通过变量作用域的两种错误用法来介绍一下C语言变量作用域 其次对代码块的使用进行了简单说明: #include <stdio.h> 1.变量的作用域(作用范围) 变量定义的那一行开始,直 ...
- 线程系列07,使用lock语句块或Interlocked类型方法保证自增变量的数据同步
假设多个线程共享一个静态变量,如果让每个线程都执行相同的方法每次让静态变量自增1,这样的做法线程安全吗?能保证自增变量数据同步吗?本篇体验使用lock语句块和Interlocked类型方法保证自增变量 ...
- JavaScript的作用域和块级作用域概念理解
作用域 作用域永远都是任何一门编程语言中的重中之重,因为它控制着变量与参数的可见性与生命周期.说到这里我们需要理解两个概念:块级作用域与函数作用域. 函数作用域 这个应该好理解,函数作用域就是说定义在 ...
- JavaScript函数定义和调用 变量作用域
本文是笔者在看廖雪峰老师JavaScript教程时的个人总结 JavaScript中函数定义可以是这样的格式 function 函数名(参数) { 函数体 } 也可以是这样的格式 ...
随机推荐
- 小小知识点(五)——MATLAB对复数的操作
MATLAB程序 a=3+4*i %复数 real(a) %求复数的实部 imag(a) %求复数的虚部 abs(a) %求复数的模 angle(a) %求复数的相位 conj(a) %求复数的复共轭 ...
- MySQL 8.0.x for Windows 解压缩版配置安装
一.官网下载MySQL8.0.16 直达官网下载Community版:https://dev.mysql.com/downloads/mysql/ 然后拉倒下方点击对应版本位数下载 二.创建my.in ...
- linux服务端日志中截取自己所需要的部分
近期开发一个图片处理的业务,涉及base64字符串解析的问题,为方便与友商间接口调试,日志中保存Base64.日,想想就肝儿疼,记录下来容易,取的时候难.为准确提取,配合两条命令即可. 1.获取日志所 ...
- 关于base64转码解码
刚好涉及到记录一下 1.JS BASE64 解码和编码 js代码: /** * * Base64 encode / decode * * @author haitao.tu * @date 2010- ...
- Elasticsearch6.x和Kibana6.x的安装
Elasticsearch6.x的安装(centos6.x下) Elasticsearch6.x目前需要至少jdk8的支持,关于如何安装jdk不在讲述.Oracle的推荐安装文档可以在Oracle的网 ...
- luogu P1613 跑路
一开始看这道题时,发现是最短路,可是搜的又是倍增的题无可分说这是倍增+最短路 但是Dijkstra,SPFA我又不熟,可是看了数据范围心中萌生一种用Floyd做的方法 不扯了 先设一个三维bool数组 ...
- Vivado怎么使用In system debug(类似于chipscope的东西)
流程 1.建立好工程后,首先设置综合选项为保留设计的层次结构,方便追查信号.
- Codeforces Round #530 (Div. 2) C D
C: *可以保留删除或者增加 ? 保留或者删除 #include<bits/stdc++.h> using namespace std; int main(){ string s; int ...
- win32: 文本编辑框(Edit)控件响应事件
过去几年,关于文本编辑框(Edit)控件的响应事件,我都是在主程序 while(GetMessage(&messages, NULL, 0, 0)) { ... } 捕获. 总感觉这种方式让人 ...
- CloseHandel(_beginthreadex): 只是关闭了线程句柄对象,并不会结束线程。
今天在测试程序的时候,在[任务管理器]中发现进程序的句柄随着多线程的不断运行,会不断的 +1. 发现原来在我的代码中,启动线程后都没有显式的调用 CloseHandle() 来关闭线程句柄. 当我准备 ...