静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。
静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间
一个由C/C++编译的程序占用的内存分为以下几个部分
栈区(stack)由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆区(heap)一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。
全局区(静态区)(static)全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后由系统释放 。
文字常量区常量字符串就是放在这里的。 程序结束后由系统释放
程序代码区—存放函数体的二进制代码。
For循环中其实不管是i++或++i都是在for循环体全部执行完毕后才执行,
如:for(int i = 0;i < 10; i++){
printf(“%d\n”,i);
}
等同于for(int i = 0;i < 10; ){
printf(“%d\n”,i);
i++;
}
而for(int i = 0;i < 10; ++i){
printf(“%d\n”,i);
}
同样和for(int i = 0;i < 10; ){
printf(“%d\n”,i);
++i;
}是一个意思
i++ :先在i所在的表达式中使用i的当前值,后让i加1
++i :让i先加1,然后在i所在的表达式中使用i的新值
i++由于是在使用当前值之后再+1,所以会需要一个临时变量来转储,而++则直接+1,不存在这样的问题。
在没有编译器优化的情况下,++i更好。优化过后两者都一样