繁体   English   中英

为什么函数参数的名称与声明时的名称不同?

[英]Why is the name of a function argument different when called from when declared?

在下面的main函数中,我正在调用circleArea()并告诉它我想使用参数circleRadius

之后,在circleArea()函数声明中,我将参数的名称更改为theRadius

据我了解,由于我在调用函数时声明了一个参数,所以当我声明函数时,它知道我要在函数中使用哪个值,因此可以给它起一个不同的名称。 真的吗?

如果是的话,当我想在函数中使用多个参数时会发生什么?

int main()
{    
    float pictureWidth, pictureHeight, pictureSurfaceArea,
    circleRadius, circleSurfaceArea; // [4.4]
    pictureWidth = 8.0;
    pictureHeight = 4.5;
    circleRadius = 5.0; // [4.7]

    pictureSurfaceArea = pictureWidth * pictureHeight;

    // Here we call our function
    circleSurfaceArea = circleArea(circleRadius); 
}

float circleArea(float theRadius) // [5.1]
{
    float theArea;
    theArea = 3.1416 * theRadius * theRadius; // pi times r square [5.4]
    return theArea;
}

是的,你是对的。 函数内部变量的本地名称可以是您想要的任何名称,相关的是

  • 调用函数时必须对应的参数类型
  • 位置(如果是第一个,第二个等等)

实际上,一旦编译了代码,生成的二进制文件根本就没有任何名称用于您的参数。 这是合法的:

void method(int a, int b);

int main()
{
  int z,x,y;

  method(x,y);
  method(z,y);
}

void method(int a, int b) {
  //
}

参数的范围与函数的每个局部变量相同,并且仅在该函数内部有效。

circleArea()函数声明中,由于我们在调用函数时声明了一个参数,因此我们正在将参数名称更改为Radus [...],因此在声明函数时,它知道我们要在函数中使用哪个值,我们可以给它起一个不同的名字。

我不确定您的意思是什么... 参数的名称仅在函数的实现 (或“主体”)内部有效。 函数主体使用参数名称引用其参数。 调用 (而不是定义)函数时传递的变量名是什么都没有关系。 它甚至可能没有名称,因为您可以传递任何表达式, circleSurfaceArea = circleArea(1.0); 同样也可以,在这种情况下,该参数甚至没有“具有名称”(呵呵,很难用正确的术语来解释)。

当我想在函数中使用多个参数时会发生什么?

然后,您使用逗号分隔参数:

float rectangleArea(float a, float b);
int main()
{    
   float pictureWidth, pictureHeight, pictureSurfaceArea,
   circleRadius, circleSurfaceArea; // [4.4]
   pictureWidth = 8.0;
   pictureHeight = 4.5;
   circleRadius = 5.0; // [4.7]

   pictureSurfaceArea = pictureWidth * pictureHeight;

   // Here we call our function
  circleSurfaceArea = circleArea(circleRadius); 
}

float circleArea(float theRadius) // [5.1]
{
   float theArea;
   theArea = 3.1416 * theRadius * theRadius; // pi times r square [5.4]
   return theArea;
}

在上面的代码中,在main函数中,您只是传递了circleRadius [actual parameter]的值,因此此值将被复制到形式参数[theRadius],此处与参数名称无关,您可以使用相同的名称为正式辩论。 在多个参数中,也与参数名称无关,只是它将获取参数值并计算并返回结果。 但是在传递参数时需要集中精力的事情是,您应该声明与实际参数相同的形式参数的“数据类型”。

函数prototype由函数名称及其参数类型列表(而非名称)组成。 即编译器没有“看到”参数名称。 当编译器看到您的呼叫时

circleSurfaceArea = circleArea(circleRadius)

它会看到您调用了circleArea(float)函数,因为circleRadiusfloat 这与您的定义匹配,因此编译器将调用与定义绑定。 参数的名称无关紧要。

这是为了您的舒适而设计的,因为它通常适合于在函数体内使用与函数调用中不同的名称命名(此处的参数称为“参数”)。 这是封装形式,在某些旧语言(如http://en.wikipedia.org/wiki/GOSUB )中不存在

封装有助于将功能用法和功能实现分开。

如果要使用多个参数,请声明并定义更多参数。 同样,编译器将看不到名称,只能看到类型。

我的答案是C而不是objective-C 可能这是一个巧合。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM