![21天学通C++(第5版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/312/31186312/b_31186312.jpg)
5.5 函数的作用域
每个函数都构成了一个函数作用域,函数作用域的概念跟变量的存储位置和生命期有关。函数的参数和在函数中声明并定义的变量即局部变量,其被分配在堆栈上,随着函数的执行而生成,随着函数的退出而消亡。
标号是唯一具有函数作用域的标识符,goto语句使用标号。标号声明使得该标识符在一个函数内的任何位置均可以被使用。
【范例5-9】标号的声明和goto语句的使用。声明了两个标号,并在函数中调用goto语句使用标号,代码如代码清单5-9所示。
代码清单5-9
![](https://epubservercos.yuewen.com/E623DA/16896237004359006/epubprivate/OEBPS/Images/txt007_51.jpg?sign=1738934175-TnmLPLqhvcXVjPkTUsrdKpcgdwshjCga-0-e510b2429bc0d0235b810513e3e5dc6f)
【运行结果】上述代码在Visual C++中运行,其运行结果如图5-16所示。
![](https://epubservercos.yuewen.com/E623DA/16896237004359006/epubprivate/OEBPS/Images/txt007_53.jpg?sign=1738934175-cUMficBicdTIaDJG07cNwxT2Egfcp3eK-0-cc41a54575eef3899e0f239cf65f2a42)
图5-16 函数作用域
【范例解析】上述代码使用了goto语句,其中的S和End均为标号。代码中goto语句使得其下的变量定义和输入等语句没有被执行,不能接收用户输入并判断,而是直接跳转到了输出“Can’t input b”的信息。
因此,goto或switch语句不应使控制在一个声明的作用域之外跳到该声明的作用域内,因为这种跳转越过了变量的声明语句,使变量不能被初始化。
注意
在进行函数原型声明时所作的参数声明表示参数在该函数作用域中,该作用域开始于函数原型声明的左括号,结束于函数原型声明的右括号。
例如,下面的代码是函数Area()的原型声明:
![](https://epubservercos.yuewen.com/E623DA/16896237004359006/epubprivate/OEBPS/Images/txt007_54.jpg?sign=1738934175-kVXBqGDbbHhNMa1lOouut9iyyFBP7Wj8-0-996e2b420e07df6f1f401e709ef0f4a9)
其中的参数声明(double width,double length)只在圆括号内有效,在程序的其他地方使用width和length必须另外有定义,否则会引起变量未定义的编译错误。例如,下面的代码引起一个无定义的标识符编译错误:
![](https://epubservercos.yuewen.com/E623DA/16896237004359006/epubprivate/OEBPS/Images/txt007_55.jpg?sign=1738934175-Ea6d8zir0nlMpkeBgXWk0oKUM3FXLc33-0-c8f86488faceaffb7dca80600059f0cb)
所以,在这个函数原型声明中的标识符width和length是可有可无的。即上面的函数原型等价于下面的函数原型声明:
![](https://epubservercos.yuewen.com/E623DA/16896237004359006/epubprivate/OEBPS/Images/txt007_56.jpg?sign=1738934175-c1FAVjPNLBgnY9zDJ1Xb8mNXVjOlwrsv-0-0610bb8be77f844213bbd6e62772d315)
但是,参数中有了标识符,可以增强可读性。上面参数中带标识符的函数原型声明使人一看就明白一个参数是宽度值,另一个是长度值。所以,在函数原型声明中,都为参数指定一个有说明意义的标识符,而且一般总是与该函数定义中参数的标识符一致。即:
![](https://epubservercos.yuewen.com/E623DA/16896237004359006/epubprivate/OEBPS/Images/txt007_57.jpg?sign=1738934175-IUqYDiBnm5XxXoN81FEdiuGYKpK2OH1u-0-60d61643e12784f00aaf97ce418dca87)