靜態局部變量具有局部作用域,它只被初始化一次,自從第一次被初始化直到程序運行結束都一直存在,它和全局變量的區別在於全局變量對所有的函數都是可見的,而靜態局部變量只對定義自己的函數體始終可見。
靜態全局變量也具有全局作用域,它與全局變量的區別在於如果程序包含多個文件的話,它作用於定義它的文件裏,不能作用到其它文件裏,即被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更好。優化過後兩者都一樣