初始化和賦值的區別

區別說明:賦值操作是在兩個已經存在的對象間進行的,而初始化是要創建一個新的對象,並且其初值來源於另一個已存在的對象。
int a=12 ; //初始化, copy 0X000C to a 
 a =12 ; //賦值, copy 0X000C to a






1、靜態變量在定義時未顯式地指定初值,則自動初始化爲相應類型的零值(數值型爲0或0.0;字符型爲'\0'),即靜態變量能夠自動初始化(有稱之爲隱式初始化),且靜態變量只初始化一次。靜態變量定義時顯式地指定了值,則其初值爲指定的值。定義時無論是否顯式地指定了初始值,都只能被初始化一次。但可以通過賦值的方式多次修改靜態變量的值。


2、初始化與賦值是不同的概念。


靜態變量的初始化是在編譯時進行,變量的賦值是在函數或程序運行時進行。靜態變量只初始化一次,但可以通過賦值的方式多次修改靜態變量的值。


 


以下程序要求主函數中每個循環結束後都能輸出5行星號。分析以下程序的輸出結果。


int i;


main()


{  void pr();  void pt();  void pk();     /*對被調函數的聲明*/


                   for(i=0;i<5;i++)  pr();             /*對函數prt()調用5次*/


              printf("\n");   


                  for(i=0;i<5;i++)  pt();             /*對函數prt()調用5次*/


                  printf("\n");


                 for(i=0;i<5;i++)  pk();            /*對函數prt()調用5次*/


}


void pr()


{    static int i=0;     /*定義時顯式地指定初值爲0,稱爲初始化,靜態變量僅一次*/


                    printf("%d: ",i);                      /*輸出上次調用該函數後保留的i的值*/


                     for(i=1;i<=5;i++);/*此句中i=1爲賦值,將上次調用後保留的i的值重新賦值爲1*/


                    printf("%c",'*');


                     printf("\n");


             }


請分析:pt函數同樣被調用了5次,但結果只輸出了一行星號,而不是5行星號。驗證了靜態變量的賦值和靜態變量的初始化的不同概念。


void pt()


{   static int i;  /*定義時未顯式地指定初值,但該變量仍被初始化一次,起初值爲0 */


                     printf("%d: ",i);                      /*輸出上次調用該函數後保留的i的值*/


 for(;i<5;i++)     /*i未被重新賦值,即保留了上次調用後的保留值(5),所以下次調用該函數時循環條件不再滿足,因爲i值已經等於5了*/


 printf("%c",'*');


                      printf("\n");


}


void pk()


{  static int i; /*定義時未顯式地指定初值,但該變量仍被初始化一次,起初值爲0*/


                  printf("%d: ",i);                      /*輸出上次調用該函數後保留的i的值*/


                  for(i=0;i<5;i++)  printf("%c",'*');                   /*循環中的i=1爲賦值              */


                  printf("\n");


               }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章