# include<iostream.h>
void f()
{
static int i = 15;
i++;
cout<< "i=" << i << endl;
}
void main()
{
for(int k = 0; k < 2; k++)
f();
}
上面这段代码输出结果为 i = 16, i = 17.
解析: 静态局部变量有一下特点:
1.该变量在全局数据区分配内存;
2.静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;
3.静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;
4.它始终主流在全局数据区,直到程序运行结束。但其作用于为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。
#include<iostream>
#include<vector>
using namespace std;
int main(void)
{
vector<int>array;
array.push_back(100);
array.push_back(300);
array.push_back(300);
array.push_back(500);
vector<int>::iterator itor;
for (itor = array.begin(); itor != array.end(); itor++)
{
if (*itor == 300)
{
itor = array.erase(itor);
}
}
for (itor = array.begin(); itor != array.end(); itor++)
{
cout << *itor << " ";
}
return 0;
}
输出结果是 : 100 300 500
解析 : erase() 一次只删除一个元素,返回一个迭代指针,指向下一个元素 。本题中,删除了第一个300后,iter指向其后一个300,再通过iter++就指向了500.
子类与子类型
子类 : 说明了新类是继承自父类
子类型:强调的是新类具有父类一样的行为(未必是继承)。
计算二进制的一的个数,这个算法叫做平行算法。
int BitCount(unsigned int n)
{
n = (n &0x55555555) + ((n >>1) &0x55555555) ; // n的相邻位相加
n = (n &0x33333333) + ((n >>2) &0x33333333) ; // n的相邻位相加(以2为单位)
n = (n &0x0f0f0f0f) + ((n >>4) &0x0f0f0f0f) ; // n的相邻位相加(以4为单位)
n = (n &0x00ff00ff) + ((n >>8) &0x00ff00ff) ; // n的相邻位相加(以8为单位)
n = (n &0x0000ffff) + ((n >>16) &0x0000ffff) ; // n的相邻位相加(以16为单位)
return n ;
}
0xaaaaaaaa = 10101010101010101010101010101010 (偶数位为1,奇数位为0)
0x55555555 = 1010101010101010101010101010101 (偶数位为0,奇数位为1)
0x33333333 = 110011001100110011001100110011 (1和0每隔两位交替出现)
0xcccccccc = 11001100110011001100110011001100 (0和1每隔两位交替出现)
0x0f0f0f0f = 00001111000011110000111100001111 (1和0每隔四位交替出现)
0xf0f0f0f0 = 11110000111100001111000011110000 (0和1每隔四位交替出现)
平行法计算二进制中1的个数,二进制中利用相邻位相加,直到最后剩下一个数,求出1的个数。
源码 -> (扫描) -> 标记 -> (语法分析) -> 语法树 -> (语义分析) -> 标识语义后的语法树 -> (源码优化) -> 中间代码 -> (代码生成) -> 目标机器代码 -> (目标代码优化) -> (最终目标代码)