C语言基础教程读书笔记5.2.(第五章函数和存储类2)
4.作用域规则
标示符只能在说明或对他定义它的函数体或分程序内饰可见的,而在该函数体或分程序外则是不可见的。
举个例子:
# include <stdio.h>
int main()
{
int a=2,b=4,c=6;
printf("%d,%d,%d\n",a,b,c); //2,4,6
{
int b=8;
float c=8.8;
printf("%d,%d,%.1f\n",a,b,c); //2,8,8.8
a=b;
{
int c;
c=b;
printf("%d,%d,%d\n",a,b,c); //8,8,8
}
printf("%d,%d,%.1f\n",a,b,c); //8,8,8.8
}
printf("%d,%d,%d\n",a,b,c); //8,4,6
getchar();
}
结果为:
5.存储类
存储类分为:
自动存储(auto)、寄存器存储(register)、外部类变量(extern)、静态类变量(static)
我们下面来举几个例子说明一下不同存储类变量的定义和特性。
1)局部变量的定义和应用:
# include <stdio.h>
int main()
{
void other();
int a;
register int b;
static int c;
a=6;
b=9;
printf("a=%d,b=%d,c=%d\n",a,b,c);
other();
other();
printf("a=%d,b=%d,c=%d\n",a,b,c);
getchar();getchar();
}
void other()
{
int a=6;
static int b=10;
a+=100;
b+=200;
printf("a=%d,b=%d\n",a,b);
}
结果为:
简单讲一下:(main函数中定义了自动变量a,寄存器类变量b和内部静态类变量c,在函、数other()中,定义了一个自动变量a和内部静态变量b,(函数名与main中相同,但不影响,因为他们作用范围在各自的函数体内。)第一次调用other()函数时,输出a和b的值分别为106和210,由于这里变量b是内部静态类的,其寿命长,在退出other()函数后仍然保存其值不被释放。由于b变量的值被保存,在第二次调用other()函数时,因为静态变量仅在编译时初始化,因此b保留上次调用后的值在经过b+=200)。
2)全局变量和局部变量的应用
# include <stdio.h>
int main()
{ void other();
extern int i;
int a=0;
static int b;
printf("i=%d,a=%d,b=%d\n",i,a,b);
a+=5;
other();
printf("i=%d,a=%d,b=%d\n",i,a,b);
i+=10;
other();
getchar();
}
int i=7;
void other()
{
static int a=2;
int b=5;
i+=5;
a+=3;
b+=1;
printf("i=%d,a=%d,b=%d\n",i,a,b);
}
结果为:
讲一下(由于外部变量i定义在主函数后,在主函数要引用i时,必须要用extern int i,语句进行说明,因为i在mian和other两个函数中均可见,所以i值无论在main函数或是other中改变都是有效的,对后面的操作均有影响)。
3)多文件程序中的作用域
# include <stdio.h> //主程序
int i;
void fun1(),fun2(),fun3();
int main()
{
i=33;
fun1();
printf("main():i=%d\n",i);
fun2();
printf("main():i=%d\n",i);
fun3();
printf("main():i=%d\n",i);
getchar();
} //主程序
# include <stdio.h> //fun1
static int i;
void fun1()
{
i=100;
printf("fun1():i=(staic)=%d\n",i);
} // fun1
# include <stdio.h> //fun2
void fun2()
{
int i=5;
printf("fun():i(auto)=%d\n",i);
if(i)
{
extern int i;
printf("fun2():i(extern)=%d\n",i);
}
}
extern int i;
void fun3()
{
i=20;
printf("fun3():i(extern)=%d\n",i);
if(i)
{
int i=10;
printf("fun3():i(auto)=%d\n",i);
}
} //fun2
结果为:
解释一下(在分程序中重新定义了变量b和c并赋初值,这时函数体外定义的b和c被隐藏起来,重新定义的b和c在起作用,a被重新复制,而非被重新定义)
转载于:https://blog.51cto.com/2948229/1161838
C语言基础教程读书笔记5.2.(第五章函数和存储类2)相关推荐
- C语言基础教程读书笔记2(第二章常量、变量、类型转换)
第二章常量.变量.类型转换<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" ...
- 《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(上)
索引: 一.SQL Server的体系结构 二.查询 三.表表达式 四.集合运算 五.透视.逆透视及分组 六.数据修改 七.事务和并发 八.可编程对象 一.SQL Server体系结构 1.1 数据库 ...
- python基础语言与应用第五章_Python基础教程读书笔记(第5章—第6章:条件、循环和其他语句;抽象)...
第五章:条件.循环和其他语句 1:print 和 import 的更多信息 1)使用逗号输出--打印多个表达式,只要将它们用逗号隔开就行: >>> print('Age:',42) ...
- 嵌入式Linux基础教程-读书笔记
waiting to be fixed. coming soon. +读书笔记: +linux kernel <Linux内核完全剖析基于0.12内核>.pdf 嵌入式Linux基础教程第 ...
- Objective-C基础教程读书笔记
第二章 对C的扩展 1.#import,让编译器引入一次头文件(且仅引入一次). 2.@符号,Objective-C对C的扩展. 第三章 面向对象编程基础知识 1.中缀符(infix notation ...
- Objective-C基础教程读书笔记(8)
第8章 Foundation Kit介绍 Objective-C是一门非常精巧实用的语言,目前我们还没有研究完它提供的全部功能.不过现在,我们先探索另一个方向,快速了解一下Cocoa中的Foundat ...
- oc 基础教程 读书笔记
转载自:http://www.cnblogs.com/smallyin00/archive/2013/03/02/2939606.html p38 @interface 定义类的公共接口,用来提供类的 ...
- Python基础教程读书笔记(第5章—第6章:条件、循环和其他语句;抽象)
第五章:条件.循环和其他语句 1:print 和 import 的更多信息 1)使用逗号输出--打印多个表达式,只要将它们用逗号隔开就行: >>> print('Age:',42) ...
- 疯狂Java讲义(读书笔记)(第五章)
第五章面向对象(下) 5.1 Java 8 增强的包装类 把字符串类型的值转换为基本类型的值有两种方式. 利用包装类提供的parseXxx(String s)静态(除了Character之外的所有包装 ...
最新文章
- mysql触发器菜鸟_mysql触发器学习
- 懂数学人的都认同:数学的本质[关联]万物(一)
- session 重写进入redis测试
- 使用tensorflow出现 ImportError: DLL load failed: 找不到指定的程序
- GNU/CPIO 学习小结
- 2021 程序媛跳槽记:学习计划篇(已收获字节等offer)
- 众推架构的进一步讨论
- php如何查询mysql数据库字符集_修改及查看mysql数据库的字符集_MySQL
- 敏捷落地的会议和工具
- LINUX文件处理命令
- 常用的字符串对象方法
- 你能卖什么,决定了你的收入落在什么档次
- 云南公安云计算平台项目获中国优秀云计算开源案例特等奖
- linux英英词典项目,五大主流英英词典(ESL)比较使用测评报告
- 微信翻译助手小程序 day2 -翻译功能页
- php kindeditor,在PHP使用kindeditor
- 网传华为员工未加班领夜宵被冻薪降考评,并终身不得领夜宵
- Python第二阶段学习 day17
- 让你越来越值钱的秘密:目标清单
- 数字电路硬件设计系列(二)之DC-DC电源设计