为什么在声明时调用函数参数的名称会有所不同?

时间:2013-01-06 21:51:11

标签: c function variables arguments

在下面的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;
}

3 个答案:

答案 0 :(得分:3)

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

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

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

void method(int a, int b);

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

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

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

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

答案 1 :(得分:2)

  

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

我不确定你的意思...... 参数的名称仅在函数的实现(或“body”)内部才有意义。函数体使用参数的名称引用其参数。当你调用(而不是定义)函数时,你传递的变量的名称并不重要。它甚至可能没有名称,因为你可以传递任何表达式,circleSurfaceArea = circleArea(1.0);也可以,在这种情况下,参数甚至没有“有名字”(嗯,很难用正确的术语来解释)

  

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

然后用逗号分隔参数:

float rectangleArea(float a, float b);

答案 2 :(得分:0)

函数prototype由函数名及其参数类型列表组成,而不是名称。即编译器不“看到”参数名称。当编译器看到你的电话时

circleSurfaceArea = circleArea(circleRadius)

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

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

封装有助于分离功能使用和功能实现。

如果您需要多个参数,请声明并定义更多参数。再次编译器不会看到名称,只有类型。

我的回答是关于C而不是objective-C。这可能是巧合。