zoukankan      html  css  js  c++  java
  • (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(' ');

        putchar('A');        //输出A

        putchar(' ');

        putchar('A');        //输出A, 非转义字符加""即原字符,即'A'表示字符A

        putchar(' ');

        putchar(65);            //输出A, 十进制的65是字符AASCII, 不用转义字符的形式, 因为putchar函数被省略的返回值为int

        putchar(' ');

        putchar('101');    //输出A, 八进制的101是字符AASCII, 必须用转义字符的形式

        putchar(' ');

        putchar('x41');    //输出A, 十六进制的41是字符AASCII, 必须用转义字符的形式

        putchar(' ');

        return 0;

    }

    //字符串输出

    #include <stdio.h>

     

    int main()

    {

        puts("Hello World!");        //输出A, 十进制的65是字符AASCII, 不用转义字符的形式

        return 0;

    }

    //格式输出

    #include <stdio.h>

        

    int main()

        {

        // "格式说明符/控制格式"%+特定字符构成, 形式是: "%[*][域宽][长度]类型";注意, 两边的引号不能省略, 中括号表示里面的内容可以省略, 中括号不用写

        

        //①d格式符, 十进制

        printf("①-------------------- ");

        int a=10;

        int b=20;

        printf("%d ",a);    //按变量a的实际长度输出

        printf("%4d ",a);    //用空格作占位符, 4表示域宽, %和4之间可以不用打空格, 即printf("%4d ",a);

        printf("%04d ",a); //用0作占位符, 4表示域宽

        //如果打印一个长整形的整数,打印语句为: printf(%ld)

        printf("%d,%d ",a,b);    //分开打印a,b变量的值

        printf("%d%d ",a,b);    //接连打印a,b变量的值

        

        //②o格式符, 八进制

        printf("②-------------------- ");

        printf("%o ",a);

        printf("% 4o ",a);    

        printf("%04o ",a);

        

        //③x格式符, 十六进制

        printf("③-------------------- ");

        printf("%x ",a);

        printf("%x ",a);

        printf("% 4x ",a);

     

    //④s格式符, 字符串

        printf("④-------------------- ");

        char *str="helloworld";

        printf("%s ",str);

        printf("%12s ",str); //左补空格

        printf("%-12s ",str);    //右补空格

        printf("%10.5s ",str);    //域宽为10, 取左端5个字符, 左补空格

        printf("%-10.5s ",str);    //域宽为10, 取左端5个字符, 右补空格

     

        //⑤f格式符, 实型数据的小数形式

        printf("⑤-------------------- ");

        float c=12.340F;

        printf("%d ",c);    //出错, a此时还是单精度浮点型

        printf("%d ",int(c));    //a强转为int

        printf("%f ",c);    //VC++ 6.0, float型可显示8个数位(不是"bit")有效数字(科学计数法里面的eE也算作一个数位), eE后面显示的指数不算float型能显示的数位

        

        //⑥e格式符, 实型数据的科学计数法形式

        printf("⑥-------------------- ");

        printf("%e ",c);    //以指数形式输出,e小写

        printf("%E ",c);    //以指数形式输出,E大写

        printf("%g ",c);    //选用"%f""%e"格式中输出宽度较短的一种格式, 不输出无意义的0; 若以指数形式输出, 则指数以大写表示

        printf("%G ",c);    //因为这里"%f"的输出宽度较短, 所以没有输出科学计数法

        return 0;

    }

    }

    //注意, 必须在12.340后面加Ff, 因为如果不加, 编译器会默认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 ");

        a=getchar();    /*在输入设备得到字符*/

        putchar(a);    /*输出字符*/

        putchar(' ');        /*输出转义字符换行*/

        getchar();            /*得到回车字符*/

        putchar(getchar());    /*得到输入字符,直接输出*/

        putchar(' ');        /*换行*/

        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 ",int1);    /*显示第一个输入的数据*/

        printf("The second is : %d ",int2);    /*显示第二个输入的数据*/

        return 0;

    }

    //"&"符号表示区变量int1int2的地址, 这里不用关心变量的具体地址是多少, 只要在代码中变量的标识符前加"&", 就表示取变量的地址

    //scanf()函数使用空白字符分隔输入的数据, 包括空格, 回车换行和制表符(tab); 下面使用的是空格.

    或者

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

    #include<stdio.h>

     

    int main()

    {

        long iLong;        /*长整型变量*/

        short iShort;    /*短整型变量*/

        int iNumber1=1;    /*整型变量,为其赋值为*/

        int iNumber2=2;    /*整型变量,为其赋值为*/

        char cChar[10];    /*定义字符数组变量*/

     

        printf("Enter the long integer ");    /*输出信息提示*/

        scanf("%ld",&iLong);                /*输入长整型数据*/

     

        printf("Enter the short integer ");/*输出信息提示*/    

        scanf("%hd",&iShort);                /*输入短整型数据*/

     

        printf("Enter the number: ");        /*输出信息提示*/

        scanf("%d*%d",&iNumber1,&iNumber2);    //输入整型数据; %d*%d之间*表明我们只能输入一个值赋给变量iNumber1, 至于iNumber2则直接取上面已经定义好的iNumber2的值.

     

        printf("Enter the string but only show three character ");/*输出信息提示*/

        scanf("%3s",cChar);                    /*输入字符串*/

     

        printf("the long interger is: %ld ",iLong); /*显示长整型值*/

        printf("the long interger is: %10d ",iLong);

        printf("the long interger is: %*d ",10,iLong);    //这一句和上一句相同, 即把12345这个数字填充在10个占位里, 多余的位置用空格代替

        printf("the short interger is: %hd ",iShort);    /*显示短整型值*/

        printf("the Number1 is: %d ",iNumber1);        /*显示整型iNumber1的值*/

        printf("the Number2 is: %d ",iNumber2);        /*显示整型iNumber2的值*/

        printf("the three character are: %s ",cChar);    /*显示字符串*/

     

        return 0;

    }

     

        printf("the long interger is: %ld ",iLong); /*显示长整型值*/

        printf("the short interger is: %hd ",iShort);    /*显示短整型值*/

        printf("the Number1 is: %d ",iNumber1);        /*显示整型iNumber1的值*/

        printf("the Number2 is: %d ",iNumber2);        /*显示整型iNumber2的值*/

        printf("the three character are: %s ",cChar);    /*显示字符串*/

        

        return 0;

    }

     

     

    setw()函数

    setw()函数, 位于库文件iomanip.h

    Sets the field width to be used on output operations. 设置输出操作的字段宽度

    字段/区段,field一个成员,它表示与对象或类关联的变量。常见于数据表中,在数据库中,大多数时,表的"列"称为"字段" ,每个字段包含某一专题的信息。就像"通讯录"数据库中,"姓名"、"联系电话"这些都是表中所有行共有的属性,所以把这些列称为"姓名"字段和"联系电话"字段。

    字段宽度/域宽(field width)就是指字段所占有的字节长度。需要在设计数据表时给与规约。比如储存单精度数的字段,它的字段宽度是4字节。

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

    }

     

  • 相关阅读:
    Oracle SQL语句收集
    SqlParameter In 查询
    SQL 性能优化
    Entity Framework
    【XLL API 函数】 xlfSetName
    【XLL API 函数】xlfUnregister (Form 2)
    【XLL API 函数】xlfUnregister (Form 1)
    【Excel 4.0 函数】REGISTER 的两种形式以及VBA等效语句
    【Excel 4.0 函数】REGISTER
    【Bochs 官方手册翻译】 第一章 Bochs介绍
  • 原文地址:https://www.cnblogs.com/ArrozZhu/p/8377660.html
Copyright © 2011-2022 走看看