2013-01-06 39 views
1

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

是,值傳遞給函數,它是免費撥打任何它想要的說法。請記住,局部變量和參數具有* local *作用域。其他地方的同一個名字可以完全指代其他的東西。 –

回答

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

由於這仍然是C,應該在調用站點之前聲明函數,以獲取類型警告和轉換。 – Chris

+0

所以如果我想在circleArea中添加一個參數,例如circleArea(circleRadius,picturRadius);那麼當我去聲明這個函數時,我將需要確保局部變量我會給picturRadius將是第二個,就像這個float circleArea(float theRadius,float picRadius)? – JohnBigs

2
circleArea()函數聲明

我們正在改變參數theRadius名[...]因爲我們聲明的說法,當我們調用的函數,所以當我們宣佈它知道的功能,我們希望它的值在函數中使用,我們可以給它一個不同的名字。

我不知道你的意思是什麼?一個說法的名稱僅事宜時,該功能的實現(或「身體」)內。函數體使用參數的名稱引用它的參數。不要緊,什麼是你傳入的變量的名字,當你調用(而不是定義)的功能。它甚至可能沒有名字,因爲你可以通過任何表達式,circleSurfaceArea = circleArea(1.0);也可以,在這種情況下,這個論點甚至不會有「名稱」(呵呵,很難用正確的術語來解釋)。

當我想在函數中使用超過1個論點發生了什麼?

然後你分開使用逗號的參數:

float rectangleArea(float a, float b); 
+0

謝謝你的回答並糾正我的問題@ H2CO3 – JohnBigs

0

功能prototype由函數名和它的列表的參數類型,沒有名字。即編譯器不會「看到」參數名稱。當編譯器看到您的通話

circleSurfaceArea = circleArea(circleRadius) 

它看到你調用函數circleArea(float)因爲circleRadiusfloat。這符合您的定義,因此編譯器將調用與定義綁定。參數的名稱無關緊要。

這是爲您的舒適製成,因爲它往往是適用於函數調用內部函數體不同於名稱參數(這裏的參數被命名爲「參數」)。這是封裝的形式,這是不存在於一些老的語言,如這裏http://en.wikipedia.org/wiki/GOSUB

封裝有助於單獨的函數用法和功能的實現。

如果你想超過1個參數,然後宣佈和更多定義它們。再次編譯器不會看到名稱,只有類型。

我的答案是約Cobjective-C。可能是這裏的巧合。

2
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; 
} 

在上面的代碼中,主要功能,你只是過客circleRadius [實際參數]的值,所以這個值將被複制到正規的說法[theRadius],這裏無關的名稱參數,你可以採用同名的正式參數。在多於一個參數中也沒有任何關於參數的名稱,它只會取參數的值並計算並返回結果。但是在傳遞參數時需要集中的東西是你應該聲明與實際參數相同的形式參數的「數據類型」。

相關問題