[C++] asd

函数的作用域不能是局部的,因为那样的函数无法被外部调用。

函数被调用时,自动变量被存放在栈中,栈中变量的数量随着被调用函数的运行增减,当被调用函数返回后,栈恢复到调用前的状态(自动变量随着函数的返回而消失)。在C++11中,寄存器变量已经失去意义,等于自动变量,保留该关键字只不过是防止使用错误。

自动变量无链接属性,而静态变量有三种:外部、内部、无链接,静态变量的数目在程序运行期间是保持不变的,所以不需要栈来处理静态变量,但是需要一块特定的内存来存储静态变量,如果静态变量未被初始化,则编译器将给其付默认值0,例如一个静态的数组,所有的元素都会被赋值为0。对于静态变量来说,在函数中声明的没有链接属性,在函数外部声明的具有内部链接属性,带有extern修饰符的具有外部链接属性,但是这三者在程序的运行期间一直存在。

自动、寄存器、静态无链接、静态内部链接、静态外部链接形成了五种变量存储方式。

外部变量是在所有的函数外部定义的变量,对于所有的函数来说,其都是外部的,因此可以在main函数之前声明外部变量,在声明之后的所有函数中都可以通过声明然后被当作外部变量使用,因此外部变量又称为全局变量。单定义规则:变量只能被定义一次,其他使用的地方只能声明,注意定义和声明的区别。

//main.cpp
#include <iostream>
using namespace std;

double val = 0.3;

void update(double dt);
void local();

int main()
{
    cout<<"global val:"<<val<<endl;
    update(0.1);
    cout<<"global val:"<<val<<endl;
    local();
    cout<<"global val:"<<val<<endl;

    return 0;
}


//extern.cpp
#include <iostream>
using namespace std;

extern double val;

void update(double dt);
void local();

void update(double dt)
{
    extern double val;
    val += dt;
    cout<<"update global val:"<<val<<endl;
}

void local()
{
    double val = 0.8;
    cout<<"local val:"<<val<<endl;
    cout<<"global val:"<<::val<<endl;
}

内部链接属性

//test1.cpp
#include <iostream>
using namespace std;

int val = 20;
int vald = 3;
static int harry = 300;

void access();

int main()
{
    cout <<"val addr:"<< &val << endl;
    cout <<"vald addr:"<< &vald << endl;
    cout <<"harry addr:"<< &harry << endl;
    access();

    return 0;
}

//test2.cpp
#include <iostream>
using namespace std;

extern int val;
static int vald = 10;
int harry = 200;

void access()
{
    cout <<"val addr:"<< &val << endl;
    cout <<"vald addr:"<< &vald << endl;
    cout <<"harry addr:"<< &harry << endl;
}

val具有外部属性,在两个文件中操作的是同一个变量,而其他两个都不是,操作的不是用一个变量。

#include <iostream>
using namespace std;

const int size = 10;

void strcount(const char *str);

int main()
{
    char input[size];
    char next;
    cout <<"Enter a line:"<< endl;
    cin.get(input,size);
    while(cin)
    {
        cin.get(next);
        while(next != '\n')
            cin.get(next);
        strcount(input);
        cout <<"Enter a new line:"<< endl;
        cin.get(input, size);
    }
    cout << "bye\n";
    return 0;
}

void strcount(const char *str)
{
    static int total=0;
    int count=0;

    cout<<"\""<<str<<"\" contains ";
    while(*str++)
        count++;
    total += count;
    cout<<"count:"<<count<<endl;
    cout<<"total:"<<total<<endl;
}

 

posted @ 2018-03-29 17:46  ingy  阅读(300)  评论(0编辑  收藏  举报