映月读书网 > 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函数。