讀古今文學網 > C語言解惑 > 6.2 函數變量的作用域 >

6.2 函數變量的作用域

【例6.3】改正下面程序中的錯誤。


#include <stdio.h>
int sum
(int
);
void main 
( 
)
{
      int x=19
;
      sum
( x 
);
      printf 
("\nThe sum is %d\n"
, x 
);
}
int sum
( int x
)
{ return 
(x+x
); }
  

【分析】程序傳遞x的一個副本到sum(x),並且期望在調用函數後,能得到兩數之和。但在sun函數中的變量x,是離開sum就馬上消失的副本,因此這個x也就不存在於main函數之中。雖然這個x不存在於main中,但它本身的返回值可以被直接使用。把它作為printf的函數,可以輸出這個計算結果。例如使用


 printf 
("\nThe sum is %d\n"
, sum
( x 
) 
);
  

語句可以輸出計算結果為38。當然,如果主程序想繼續使用x,則x的值還是原來的x值,即x=19。sum函數返回計算結果,應使用一個同類型的變量接收這個返回值。本程序仍用x來接收,sum函數的return可以使用表達式,所以沒有必要將計算之後的值作為返回值。修改後的完整程序如下:


#include <stdio.h>
int sum
(int
);
void main 
( 
)
{
      int x=19
;
      x=sum
( x 
);
      printf 
("\nThe sum is %d\n"
, x 
);
}
int sum
( int x
)
{ return x+x
; }
  

【例6.4】改正下面程序中的錯誤。


#include <stdio.h>
int mul
(int
);
int main 
( 
)
{
      const int K=3
;
      double x=8
,y
;
      y=mul
( x
);
      y+=x
;
      printf 
("\n  %d\n"
, y 
);
      return 0
;
}
double mul
( double x
)
{ return 
(x*K
); }
  

聲明的函數原型與定義不符合。正確的聲明如下:


double mul
(double
);
  

函數設計的也不對,因為K不是mul函數里的變量,它無法使用這個變量,應為它增加一個整型變量。修改後的程序如下:


#include <stdio.h>
double mul
(double
,int
);
int main 
( 
)
{
      const int K=3
;
      double x=8
,y
;
      y=mul
( x
,K 
);
      y += x
;
      printf 
("y=%lf\n"
, y 
);
      return 0
;
}
double mul
( double x
,int k
)
{ return 
(x*k
); }
  

程序輸出結果如下:


y=32.000000
  

如果不願意修改mul函數,可以將K的定義放到主函數外面,將其定義為外部變量。如下三條語句是等效的:


extern int K=3
;
static int K=3
;
const int K=3
;
  

但是,更推薦使用const定義。作為函數定義來講,希望自成系統。從這一點來看,還是推薦使用兩個參數設計mul函數。