(C/C++学习笔记) 三. 作用域和可见性
三. 作用域和可见性
● 标识符的作用域
标识符的作用域是标识符在程序源代码中的有效范围,从小到大分为函数原型作用域、块作用域(局部作用域),文件作用域(全局作用域)。 1. 函数原型作用域 函数原型作用域是C++程序中最小作用域。函数原型中的参数,其作用域始于"(",结束于")"。 例如,设有下列原型声明(注意此时函数没有定义): 2. 块作用域(局部作用域) 所谓的块就是用{}括起来的一段程序,在块中定义的标识符,作用域从声明处开始,一直到块的大括号为止。其中有下列情况属于一个块: (1) 函数的形参与函数体属于一个块; (2) for()语句中,括号()中属于一个块; 3. 类作用域 类的成员具有类作用域,其范围包括类体和非内联成员函数的函数体。 如果在类作用域以外访问类的成员,要通过类名(访问静态成员),或者该类的对象名、对象引用、对象指针(访问非静态成员)。 4. 文件作用域: 不在函数原型中, 也不在块中的标识符, 其作用域开始于声明点, 结束于文件尾, 具有文件作用域. 函数, 全局变量与常量有文件作用域. 如下例中的全局变量i=100, j=200以及函数fun(). 5. 命名空间作用域 具有命名空间作用域的变量就是全局变量(外部变量). |
#include <iostream> using namespace std; int i=100,j=200; void fun(int i=2) { cout<<"L2: i="<<i<<endl; { int i=3; cout<<"L3: i="<<i<<endl; { for(int i=4;i<5;cout<<"L6: i="<<i<<endl,i++) { cout<<"L4: i="<<i<<endl; int i=5; i++; cout<<"L5: i="<<i<<endl; } } } } void main() { fun(); } |
● 可见性
可见性是从对标识符的引用的角度来谈的概念. 程序运行到某一点, 能够被引用的标识符, 就是该处可见的标识符. 如果某标识符在某处可见,则就可以在该处引用此标识符. 可见性表示从内存作用域向外层作用域"看"时能看到什么.下面的作用域的层次: |
● 转义字符和字符串常量
//"\ddd"表示1~3位八进制数ddd对应的字符,例如 '\141' 代表字符常量 'a', "\xhh"表示1~2位十六进制数hh对应的字符,例如 '\x41' 代表字符常量 'A'. 注意, 这和C语言中"格式说明符(Format Specifiers),如:%i or %d"不一样, #include <iostream.h> int main() { cout<<"The charcter is \141."<<endl; cout<<"The charcter is \x41."<<endl; return 0; } #include <iostream> //头文件引用 using namespace std; //命名空间的引用 int main() { cout << "Please enter YES or NO." << endl; cout << "Please enter YES" \ " or NO." << endl; cout << "Please enter \"YES\" or \"NO\"." << endl; return 0; } |
● 字符输出, 字符串输出, 格式输出
字符输出—函数原型: int putchar(int *ch) //int经常省略, 特别注意, 形参的类型为int, 当然,调用的时候不用写 字符串输出—函数原型: int puts(char *str) //调用时, 不用写返回值类型, 和形参类型 格式输出—函数原型: printf ("format_specifier", arg1, ...) //arg1等形参可以是变量, 常量等表达式 ●printf()函数与puts()函数的区别: 前者可输出人意类型的字符, 后者只可输出字符串 |
//字符输出 #include <stdio.h> int main() { char a='A'; putchar(a); //输出A putchar('\n'); putchar('A'); //输出A putchar('\n'); putchar('\A'); //输出A, 非转义字符加"\"即原字符,即'\A'表示字符A putchar('\n'); 是字符A的ASCII码, 不用转义字符的形式, 因为putchar函数被省略的返回值为int型 putchar('\n'); 是字符A的ASCII码, 必须用转义字符的形式 putchar('\n'); 是字符A的ASCII码, 必须用转义字符的形式 putchar('\n'); return 0; } |
//字符串输出 #include <stdio.h> int main() { 是字符A的ASCII码, 不用转义字符的形式 return 0; } |
//格式输出 #include <stdio.h> int main() { // "格式说明符/控制格式"由%+特定字符构成, 形式是: "%[*][域宽][长度]类型";注意, 两边的引号不能省略, 中括号表示里面的内容可以省略, 中括号不用写 //①d格式符, 十进制 printf("①--------------------\n"); int a=10; int b=20; printf("%d\n",a); //按变量a的实际长度输出 printf("%4d\n",a); //用空格作占位符, 4表示域宽, %和4之间可以不用打空格, 即printf("%4d\n",a); printf("%04d\n",a); //用0作占位符, 4表示域宽 //如果打印一个长整形的整数,打印语句为: printf(%ld) printf("%d,%d\n",a,b); //分开打印a,b变量的值 printf("%d%d\n",a,b); //接连打印a,b变量的值 //②o格式符, 八进制 printf("②--------------------\n"); printf("%o\n",a); printf("% 4o\n",a); printf("%04o\n",a); //③x格式符, 十六进制 printf("③--------------------\n"); printf("%x\n",a); printf("%x\n",a); printf("% 4x\n",a); //④s格式符, 字符串 printf("④--------------------\n"); char *str="helloworld"; printf("%s\n",str); printf("%12s\n",str); //左补空格 printf("%-12s\n",str); //右补空格 个字符, 左补空格 个字符, 右补空格 //⑤f格式符, 实型数据的小数形式 printf("⑤--------------------\n"); float c=12.340F; printf("%d\n",c); //出错, a此时还是单精度浮点型 printf("%d\n",int(c)); //将a强转为int型 个数位(不是"bit"位)有效数字(科学计数法里面的e或E也算作一个数位), e或E后面显示的指数不算float型能显示的数位 //⑥e格式符, 实型数据的科学计数法形式 printf("⑥--------------------\n"); printf("%e\n",c); //以指数形式输出,e小写 printf("%E\n",c); //以指数形式输出,E大写 printf("%g\n",c); //选用"%f"或"%e"格式中输出宽度较短的一种格式, 不输出无意义的0; 若以指数形式输出, 则指数以大写表示 printf("%G\n",c); //因为这里"%f"的输出宽度较短, 所以没有输出科学计数法 return 0; } } //注意, 必须在12.340后面加F或f, 因为如果不加, 编译器会默认12.340是双精度浮点型点型常量, 如果强制将它赋值给单精度浮点型变量a, 编译器会提示" truncation from 'const double' to 'float'", 即"从双精度的常量到浮点型的转换要进行截短". 如果在12.340后面加后缀L, 表示它是一个长双精度常量.(没有双精度的后缀, 因此一个实型数如果不带后缀就是双精度的) |
//还有另外一种以八进制形式显示数据的方法 #include <iostream.h> //包含iostream.h头文件 main() { int a=010,b=10,c=0X10; cout<<"OCT:"; cout<<oct; cout<<" a="<<a; cout<<" b="<<b; cout<<" c="<<c<<endl; } |
● 字符输入, 字符串输入, 格式输入
字符输入: int getchar(); //int可以省略 字符串输入: char *gets(char *str) 格式输入: scanf("format",&name1,...) |
//字符输出 #include<stdio.h> int main() { char a; /*声明变量*/ printf("input a character\n"); a=getchar(); /*在输入设备得到字符*/ putchar(a); /*输出字符*/ putchar('\n'); /*输出转义字符换行*/ getchar(); /*得到回车字符*/ putchar(getchar()); /*得到输入字符,直接输出*/ putchar('\n'); /*换行*/ return 0; /*程序结束*/ } |
//字符串输出 int main() { char str[30]; /*定义一个字符数组变量*/ gets(str); /*获取字符串*/ puts(str); /*输出字符串*/ return 0; /*程序结束*/ } |
//格式输出 #include<stdio.h> int main() { int int1,int2; /*定义两个整型变量*/ puts("Please enter two numbers:"); /*通过puts函数输出提示信息的字符串, 这里不用printf, 是因为printf还需要换行的指令, 而puts()函数直接换行*/ scanf("%d%d",&int1,&int2); /*通过scanf得到输入的数据; %d%d中间不能有逗号*/ printf("The first is : %d\n",int1); /*显示第一个输入的数据*/ printf("The second is : %d\n",int2); /*显示第二个输入的数据*/ return 0; } //"&"符号表示区变量int1和int2的地址, 这里不用关心变量的具体地址是多少, 只要在代码中变量的标识符前加"&", 就表示取变量的地址 //scanf()函数使用空白字符分隔输入的数据, 包括空格, 回车换行和制表符(tab); 下面使用的是空格. 或者 //我们看到, 我们给int1和int2分别输入数据时, 应该打一个空格, 或者打回车. #include<stdio.h> int main() { long iLong; /*长整型变量*/ short iShort; /*短整型变量*/ int iNumber1=1; /*整型变量,为其赋值为*/ int iNumber2=2; /*整型变量,为其赋值为*/ char cChar[10]; /*定义字符数组变量*/ printf("Enter the long integer\n"); /*输出信息提示*/ scanf("%ld",&iLong); /*输入长整型数据*/ printf("Enter the short integer\n");/*输出信息提示*/ scanf("%hd",&iShort); /*输入短整型数据*/ printf("Enter the number:\n"); /*输出信息提示*/ scanf("%d*%d",&iNumber1,&iNumber2); //输入整型数据; %d*%d之间*表明我们只能输入一个值赋给变量iNumber1, 至于iNumber2则直接取上面已经定义好的iNumber2的值. printf("Enter the string but only show three character\n");/*输出信息提示*/ scanf("%3s",cChar); /*输入字符串*/ printf("the long interger is: %ld\n",iLong); /*显示长整型值*/ printf("the long interger is: %10d\n",iLong); 这个数字填充在10个占位里, 多余的位置用空格代替 printf("the short interger is: %hd\n",iShort); /*显示短整型值*/ printf("the Number1 is: %d\n",iNumber1); /*显示整型iNumber1的值*/ printf("the Number2 is: %d\n",iNumber2); /*显示整型iNumber2的值*/ printf("the three character are: %s\n",cChar); /*显示字符串*/ return 0; } printf("the long interger is: %ld\n",iLong); /*显示长整型值*/ printf("the short interger is: %hd\n",iShort); /*显示短整型值*/ printf("the Number1 is: %d\n",iNumber1); /*显示整型iNumber1的值*/ printf("the Number2 is: %d\n",iNumber2); /*显示整型iNumber2的值*/ printf("the three character are: %s\n",cChar); /*显示字符串*/ return 0; } |
● setw()函数
setw()函数, 位于库文件iomanip.h Sets the field width to be used on output operations. 设置输出操作的字段宽度 |
● 字段/区段,field,一个成员,它表示与对象或类关联的变量。常见于数据表中,在数据库中,大多数时,表的"列"称为"字段" ,每个字段包含某一专题的信息。就像"通讯录"数据库中,"姓名"、"联系电话"这些都是表中所有行共有的属性,所以把这些列称为"姓名"字段和"联系电话"字段。 字节。 |
#include <iostream> // std::cout, std::endl #include <iomanip> // std::setw int main () { std::cout << std::setw(10); //如果声明区写了using namespace std;, 就可以直接写成cout << setw(10); std::cout << 77 << std::endl; std::cout<<std::setw(5)<<12345<<std::endl; //如果声明区写了using namespace std;, 就可以直接写setw(5) std::cout<<std::setw(6)<<12345<<std::endl; return 0; } |
(C/C++学习笔记) 三. 作用域和可见性的更多相关文章
- angular学习笔记(三十)-指令(10)-require和controller
本篇介绍指令的最后两个属性,require和controller 当一个指令需要和父元素指令进行通信的时候,它们就会用到这两个属性,什么意思还是要看栗子: html: <outer‐direct ...
- angular学习笔记(三十)-指令(7)-compile和link(2)
继续上一篇:angular学习笔记(三十)-指令(7)-compile和link(1) 上一篇讲了compile函数的基本概念,接下来详细讲解compile和link的执行顺序. 看一段三个指令嵌套的 ...
- angular学习笔记(三十)-指令(6)-transclude()方法(又称linker()方法)-模拟ng-repeat指令
在angular学习笔记(三十)-指令(4)-transclude文章的末尾提到了,如果在指令中需要反复使用被嵌套的那一坨,需要使用transclude()方法. 在angular学习笔记(三十)-指 ...
- angular学习笔记(三十)-指令(5)-link
这篇主要介绍angular指令中的link属性: link:function(scope,iEle,iAttrs,ctrl,linker){ .... } link属性值为一个函数,这个函数有五个参数 ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- [Firefly引擎][学习笔记三][已完结]所需模块封装
原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读: 笔记三主要就是各个模块的封装了,这里贴 ...
- JSP学习笔记(三):简单的Tomcat Web服务器
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- VSTO学习笔记(三) 开发Office 2010 64位COM加载项
原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...
随机推荐
- [Maven] guide: maven in 5 minutes
ran during my bad network connection, it' s more that just 5 minutes. 1. execute "mvn archetype ...
- R语言中知识点总结(二)
一些函数不知道什么意思要查,看数值例子,做笔记,知道函数的功能,函数和返回值. 网页上查找关键词,巧用查找(ctrl+F) 数据读取处理,有read.table read R-读取数据(导入csv ...
- 雷林鹏分享:C# 类型转换
C# 类型转换 类型转换从根本上说是类型铸造,或者说是把数据从一种类型转换为另一种类型.在 C# 中,类型铸造有两种形式: 隐式类型转换 - 这些转换是 C# 默认的以安全方式进行的转换.例如,从小的 ...
- English trip M1 - AC6 How to make salad? Teacher:Patrick
In this lesson you will learn to give instructions. 在本课中,您将学习如何提供说明. 课上内容(Lesson) How to make a sal ...
- You Don't Know JS: Scope & Closures (附加:Lexical/dynamic作用域)(附加:Lexical-this)
JavaScript只有Lexical Scope 模式 Lexical Scope就是在写代码的时候,定义函数的时候创建的作用域! 而动态作用域是在runtime时,函数被调用的地方的作用域! 实际 ...
- KM算法 带权二分匹配 O(n^3)
#include<cstdio> #include<cstdlib> #include<cstring> #include<string> #inclu ...
- es的分词器analyzer
analyzer 分词器使用的两个情形: 1,Index time analysis. 创建或者更新文档时,会对文档进行分词2,Search time analysis. 查询时,对查询语句 ...
- Elasticsearch SQL
es sql是一个X-pack组件 ,允许对es执行类似sql的查询,可以将Elasticsearch SQL理解为一个编译器,既能理解es,又能理解sql.可以通过利用es,实施大规模实时读取和处理 ...
- selenium chrome 自动加载flash
#coding:utf-8from selenium import webdriverfrom selenium.webdriver.support.select import Selectfrom ...
- 05 爬虫之scrapy
一 scrapy框架简介 01 什么是scrapy: Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队 ...