• (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;

    }

     

  • 相关阅读:
    PP: DeepAR: probabilistic forecasting with autoregressive recurrent networks
    PP: A multi-horizon quantile recurrent forecaster
    BK: Data mining
    PP: Tripoles: A new class of relationships in time series data
    BK: How to read a book 第四篇
    BK: How to read a book 第一篇
    PP: Toeplitz Inverse Covariance-Based Clustering of Multivariate Time Series Data
    (二)Android性能优化系列---Improving Layout Performance(一)(转载自:http://xhmj12.iteye.com/blog/2064258)
    (一)Android性能优化系列---Performance Tips(文章出处:http://developer.android.com/training/articles/perf-tips.html#Myths)
    (二十八)动态加载布局
  • 原文地址:https://www.cnblogs.com/ArrozZhu/p/8377660.html
Copyright © 2020-2023  润新知