2012-09-23 76 views
2

我最近開始學習C++,我做得很好,到目前爲止,直到我來到 到函數聲明和調用。 我不明白到底是什麼return是,爲什麼每一個功能需要它。我不明白的返回

另外,爲什麼你需要一個函數類型?例如

int xamplefunc(){} 

什麼是int類型?

編輯:嗯,我不知道如果我得到它。回報究竟做什麼?窗簾背後真的發生了什麼?調用函數是否將返回值存儲爲變量,或者是什麼?

+0

函數可能返回void(這意味着不返回任何內容,因此return語句不是必需的),或者返回某種類型,您必須在函數實現中返回一個返回與返回聲明相同類型的語句的類型。 – nhahtdh

回答

3

也許它可以幫助你記住一個函數是如何在數學中定義的:函數f(x)接受一個參數x並返回一個可以從x計算出來的值。例如,sin函數取一個實數並返回另一個實數,即該數的正弦值。

C++函數是這個模型。出於這個原因,當你定義一個函數時,你必須告訴編譯器函數需要哪些類型的參數(這是括號中的參數列表)以及它返回的是什麼類型的值(這是你調用的返回類型上面的「函數類型」;注意在C++中,術語「函數類型」用於不同的東西)。

所以,當你想要寫它計算在C++中的正弦函數,你會做它,如下所示:

double sin(double x) 
{ 
    // code to calculate the sine of x 
} 

但是現在你到另一個問題:不像數學,你通常寫函數作爲單一表達式,在C++中,您將編寫一些要執行的語句列表。該報表清單通常會操縱許多值。那麼你如何告訴編譯器哪個值實際上是應該作爲x的正弦返回的值?

對此的回答是return聲明。所以你的功能可能是這樣的:

double sin(double x) 
{ 
    double result = 0; 
    // code to modify result so finally it contains the sine of x 
    return result; 
} 

但是請注意,這return不僅告訴編譯器「這是返回的結果」,還要「當你到這種說法,你就完蛋了,回。給呼叫者現在

所以考慮例如下面的代碼,它使用特殊處理來檢測楠無限值(爲簡單起見,我假設功能is_badgetnan已經爲這個目的寫的):

double sin(double x) 
{ 
    if (is_bad(x)) 
    return getnan(); // when this is executed, the function *immediately* returns 
    // if we get here, we therefore know the value x is a regular number 
    double result; 
    // calculate the sine 
    return result; 
} 

現在有時你想寫一些你想在通話中執行的代碼,但不需要需要返回一個值。其他一些語言爲此使用了一個單獨的構造文本,但是C++通過僅僅引入一個類型來模擬這種差異。該類型是void。在這種情況下,您不需要明確的return聲明,因爲無論如何都沒有任何回報。例如:然而

void say_hello() 
{ 
    std::cout << "Hello!\n"; 
} 

注意,return聲明仍然可以爲早期的回報是有用的,這就是爲什麼它被允許在這種情況下,也:

void say_hello(std::string to_whom) 
{ 
    if (to_whom = "satan") 
    return; // I don't say hello to satan! 
    std::cout << "Hello " << to_whom << "!\n"; 
} 

最後,關於main備註功能:這一個也有強制性返回值int。使用該返回值,可以告訴程序的調用者您的程序是否成功完成或發生了錯誤。所以,你可以寫(使用<cstdlib>定義的常量)

int main() 
{ 
    return EXIT_SUCCESS; // I've succeeded in doing nothing! 
} 

int main() 
{ 
    return EXIT_FAILURE; // I have no idea what I was supposed to do, 
         // so I couldn't do it :-) 
} 

注意,代替EXIT_SUCCESS一個也可以返回0表示成功(的確,通常EXIT_SUCCESS只具有價值0

現在main有一個附加規則,與其他任何返回值函數不同,您可以省略return聲明。如果這樣做,則效果與在函數結尾處寫入return 0;的效果相同。

2

你所謂的功能「類型」是函數的返回類型。這意味着對該函數的調用將返回該類型的對象。 return語句是函數返回的地方。

int random() { 
    return 4; 
} 

該函數返回一個int。你可以把它的值賦給一個int:

int n = random(); 
+0

公平的擲骰子選擇,呃? – Puppy

+0

@DeadMG正好,很好看! – juanchopanza

0
int xamplefunc(){} 

的函數,返回int類型的值,接收什麼。此代碼是不正確的,因爲沒有return,如果沒有編譯錯誤 - 一些垃圾將被退回。

3

其像

return_type function_name(parameter list) 
    {  
    //body of the function  
    } 

的return_type指定數據在函數返回的類型。 return_type可以是無效的,這意味着函數不會返回任何數據類型。 function_name是該函數的名稱。函數的名字應該以字母或下劃線開頭。參數列表由用逗號分隔的變量及其數據類型組成。參數列表可以是空的,這意味着函數不包含任何參數。參數列表應包含的變量

例如兩個數據類型和名稱,

int factorial(int n, float j) 

讀取良好

由@DeadMg http://www.wide-language.com/cpptuts/functions.html

+0

得到-1爲cplusplus.com。即使在這樣的基本示例中,代碼風格也很糟糕。 – Puppy

+0

@DeadMG謝謝我刪除了它 –

+0

@DeadMG請證明一個更好的在線資源鏈接到操作,因爲我不知道任何資源(我已閱讀了硬書) –

0

做一些操作後,經常你需要將計算出來的新值返回給函數調用者。 假設我想補充兩個數字&返回除了來電顯示,然後我可以寫功能

int add(int x,int y) 
{ 
return X+y; 
} 

這裏return語句告訴,U [R返回int值。
如果你不希望任何回報,則U只需使用返回類型爲void如下

void add(int x,int y) 
{ 
//some statements; 
} 
2

你有一個銀行系統。你想讓用戶請求他們的平衡。你實現了一個getCurrentBalance方法。一旦你在方法體中計算它,你將需要一個返回類型來回饋它們的平衡。您還需要輸入參數,他們的帳號可能:

double getCurrentBalance (int AccountNo) 
{ 
    double balance = //Check balance for AccountNo in Database or whereever 
    return balance; 
} 

不要看太多爲我用,請類型。我知道double現在不是最好的。

return balance; 

必須比賽退貨類型,即雙。但是,你可以返回到隱式轉換爲double的東西。如果你願意,你可以返回int平衡(當然放鬆精度)。

1

當你調用一個函數時,你有時候想要返回一些東西,例如,你可以調用一個簡單的計算函數(2x2),並且你想要答案。 如果無法返回答案,則需要使用各種解決方法。

你所謂的「函數類型」實際上是你期望從函數中得到的答案的類型。在你的情況,你所期望的函數返回一個int類型的值(例如數字)

如果xamplefunc定義像這樣:

int xamplefunc(){ 
    return 2*2; 
} 

你所期望的,當你調用找回4功能。

1

return type具有爲了知道給定類型的變量,這registers最適合的bitsize被稱爲到編譯infer the memory addresses向其讀寫以及所述address intervals用於最優分配。

函數可能不會返回一個值(void)。如果它返回一個值,則該值必須可由該函數的調用者獲得。

被調用函數將其返回值放在調用者函數已知且調用方函數必須能夠訪問的位置。在執行ret指令之前將返回值存儲在內存中:

例如,鑑於以下功能:

int xamplefunc(int x, int y) 
{ 
    return x + y; 
} 

它將在x86機器上用MSVC編譯器組裝到:

define i32 @xamplefunc(i32 %x, i32 %y) nounwind uwtable readnone { 
    %1 = add nsw i32 %y, %x 
    ret i32 %1 
} 

注:

:[email protected] 
push ebp 
mov ebp, esp 
mov eax, [ebp + 8] 
mov edx, [ebp + 12] 
add eax, edx 
pop ebp 
ret 8 

或通過LLVM在x86機器上:使用的順序和寄存器可能因編譯器和編譯器和版本而異,這是軟件取證的一個有用屬性。

某些語言(例如Coffeescript)也通過返回函數聲明中最後一個聲明的值來提供隱式返回。