(C/C++学习笔记) 三. 作用域和可见性

时间:2022-08-30 13:30:08

三. 作用域和可见性

● 标识符的作用域

标识符的作用域是标识符在程序源代码中的有效范围,从小到大分为函数原型作用域、块作用域(局部作用域),文件作用域(全局作用域)。

1. 函数原型作用域

函数原型作用域是C++程序中最小作用域。函数原型中的参数,其作用域始于"(",结束于")"。

例如,设有下列原型声明(注意此时函数没有定义):

(C/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();

}

(C/C++学习笔记) 三. 作用域和可见性

(C/C++学习笔记) 三. 作用域和可见性

(C/C++学习笔记) 三. 作用域和可见性

● 可见性

可见性是从对标识符的引用的角度来谈的概念.

程序运行到某一点, 能够被引用的标识符, 就是该处可见的标识符.

如果某标识符在某处可见,则就可以在该处引用此标识符.

可见性表示从内存作用域向外层作用域"看"时能看到什么.下面的作用域的层次:

(C/C++学习笔记) 三. 作用域和可见性

 

● 转义字符和字符串常量

//"\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;

}

(C/C++学习笔记) 三. 作用域和可见性

#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;

}

(C/C++学习笔记) 三. 作用域和可见性

● 字符输出, 字符串输出, 格式输出

字符输出—函数原型: 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;

}

(C/C++学习笔记) 三. 作用域和可见性

//字符串输出

#include <stdio.h>

int main()

{

是字符A的ASCII码, 不用转义字符的形式

return 0;

}

(C/C++学习笔记) 三. 作用域和可见性

//格式输出

#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;

}

}(C/C++学习笔记) 三. 作用域和可见性

//注意, 必须在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;

}

(C/C++学习笔记) 三. 作用域和可见性

● 字符输入, 字符串输入, 格式输入

字符输入: 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;            /*程序结束*/

}

(C/C++学习笔记) 三. 作用域和可见性

//字符串输出

int main()

{

char str[30];    /*定义一个字符数组变量*/

gets(str);        /*获取字符串*/

puts(str);        /*输出字符串*/

return 0;            /*程序结束*/

}

(C/C++学习笔记) 三. 作用域和可见性

//格式输出

#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); 下面使用的是空格.

(C/C++学习笔记) 三. 作用域和可见性或者 (C/C++学习笔记) 三. 作用域和可见性

//我们看到, 我们给int1和int2分别输入数据时, 应该打一个空格, 或者打回车.

(C/C++学习笔记) 三. 作用域和可见性

#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;

}

(C/C++学习笔记) 三. 作用域和可见性

● 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++学习笔记) 三. 作用域和可见性

(C/C++学习笔记) 三. 作用域和可见性的更多相关文章

  1. angular学习笔记&lpar;三十&rpar;-指令&lpar;10&rpar;-require和controller

    本篇介绍指令的最后两个属性,require和controller 当一个指令需要和父元素指令进行通信的时候,它们就会用到这两个属性,什么意思还是要看栗子: html: <outer‐direct ...

  2. angular学习笔记&lpar;三十&rpar;-指令&lpar;7&rpar;-compile和link&lpar;2&rpar;

    继续上一篇:angular学习笔记(三十)-指令(7)-compile和link(1) 上一篇讲了compile函数的基本概念,接下来详细讲解compile和link的执行顺序. 看一段三个指令嵌套的 ...

  3. angular学习笔记&lpar;三十&rpar;-指令&lpar;6&rpar;-transclude&lpar;&rpar;方法&lpar;又称linker&lpar;&rpar;方法&rpar;-模拟ng-repeat指令

    在angular学习笔记(三十)-指令(4)-transclude文章的末尾提到了,如果在指令中需要反复使用被嵌套的那一坨,需要使用transclude()方法. 在angular学习笔记(三十)-指 ...

  4. angular学习笔记&lpar;三十&rpar;-指令&lpar;5&rpar;-link

    这篇主要介绍angular指令中的link属性: link:function(scope,iEle,iAttrs,ctrl,linker){ .... } link属性值为一个函数,这个函数有五个参数 ...

  5. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  6. &lbrack;Firefly引擎&rsqb;&lbrack;学习笔记三&rsqb;&lbrack;已完结&rsqb;所需模块封装

    原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读:        笔记三主要就是各个模块的封装了,这里贴 ...

  7. JSP学习笔记&lpar;三&rpar;&colon;简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  8. java之jvm学习笔记三&lpar;Class文件检验器&rpar;

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  9. VSTO学习笔记&lpar;三&rpar; 开发Office 2010 64位COM加载项

    原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...

随机推荐

  1. apache安全配置---禁止访问特定文件,防止日志、压缩包被下载

    指定禁止访问 某些后缀的文件 修改apache配置httpd.conf,在最后加上配置后,重启apache <Files ~ ".txt|.log|.zip|.gz|.sql&quot ...

  2. the difference between const int &ast;&comma; int &ast; const&comma; int const &ast;

    Some people may be confused about the sequence of const and * on declaration in C++/C, me too. Now I ...

  3. highcharts联合jquery ajax 后端取数据

    Highcharts是一个制作图表的纯Javascript类库,主要特性如下: 兼容性:兼容当今所有的浏览器,包括iPhone.IE和火狐等等: 对个人用户完全免费: 纯JS,无BS: 支持大部分的图 ...

  4. 个人分享:平时开发中感觉几款不错 IDE 、插件、工具

    本人主业 C# 开发,由于是做 Web 开发,所以像 SQL.JavaScript 这些肯定经常要接触到.当然,平时本人也写过 Node.js.Java.Python之类,不过,这些只能讲简单了解而已 ...

  5. 将string转化为char&ast;的方法

    在构造文件流变量时候发现,fstream的第一个参数,即文件路径必须是const char * 如: string s = "/home/user/1.txt"; fstream ...

  6. fill 函数

    fill函数的作用是:将一个区间的元素都赋予val值.函数参数:fill(first,last,val);//first为容器的首迭代器,last为容器的末迭代器,val为将要替换的值. 例题:给你n ...

  7. Android内存分析工具DDMS heap &plus; MAT 安装和使用

    一  Java内存分析工具扫盲 如果像我一样一点都不了解,可以先进行内存分析工具扫盲   MAT介绍:     Eclipse Memory Analyzer(MAT)一个功能丰富的 JAVA 堆转储 ...

  8. 使用java创建kafka的生产者和消费者

    创建一个Kafka的主题,连接到zk集群,副本因子3,分区3,主题名是test111        [root@h5 kafka]# bin/kafka-topics.sh --create --zo ...

  9. CodeForces 448

    A:Rewards: 题目链接:http://codeforces.com/problemset/problem/448/A 题意:Bizon有a1个一等奖奖杯,a2个二等奖奖杯,a3个三等奖奖杯,b ...

  10. uploadify3&period;2&period;1的参数设置

    $('#file_upload').uploadify({ auto:false, //接受true 或 false两个值,当为true时选择文件后会自动上传:为false时只会把选择的文件增加进队列 ...