return
陳述式 (C)
return
陳述式可結束函式的執行,並且將控制權還給呼叫函式。 執行作業會在進行呼叫的函式中緊接著呼叫之後繼續進行。 return
陳述式可將值傳回至呼叫函式。 如需詳細資訊,請參閱傳回類型。
語法
jump-statement
:
return
expression
opt;
expression
的值 (如果有) 會傳回至呼叫函式。 如果省略 expression
,則函式的傳回值會是未定義。 此運算式 (如果有) 會先評估,再轉換為函式所傳回的類型。 當 return
陳述式在具有 void
傳回類型的函式中包含運算式時,編譯器會產生警告,而且不會評估運算式。
如果函式定義中未出現 return
陳述式,則會在執行所呼叫函式的最後一個陳述式之後,自動將控制權還給呼叫函式。 在此情況下,所呼叫函式的傳回值會是未定義。 如果函式具有 void
以外的傳回類型,這是嚴重的錯誤,而編譯器會列印警告診斷訊息。 如果函式具有 void
傳回類型,此行為就沒有問題,但可能被視為不良的樣式。 使用純 return
陳述式來清楚說明您的意圖。
作為良好的工程做法,請一律指定函式的傳回類型。 如果不需要傳回值,請宣告函式具有 void
傳回類型。 如果未指定傳回類型,C 編譯器會假設預設傳回類型為 int
。
許多程式設計人員使用括號括住 return
陳述式的 expression
引數。 不過,C 不需要括號。
如果編譯器找到放在 return
陳述式之後的任何陳述式,編譯器可能會發出有關執行不到的程式碼的警告診斷訊息。
在 main
函式中,return
陳述式和運算式都是選擇性的。 如果指定傳回的值,則發生的情況取決於實作。 Microsoft特定:Microsoft C 實作會將運算式值傳回叫用程式的程式,例如 cmd.exe
。 如果未提供任何 return
運算式,Microsoft C 執行階段會傳回值,指出成功 (0) 或失敗 (非零值)。
範例
此範例是數個部分中的一個程式。 它會示範 return
陳述式,以及如何同時用來結束函式執行,以及選擇性地傳回值。
// C_return_statement.c
// Compile using: cl /W4 C_return_statement.c
#include <limits.h> // for INT_MAX
#include <stdio.h> // for printf
long long square( int value )
{
// Cast one operand to long long to force the
// expression to be evaluated as type long long.
// Note that parentheses around the return expression
// are allowed, but not required here.
return ( value * (long long) value );
}
square
函式會傳回其引數的平方,以較寬的類型防止算術錯誤。 Microsoft特定:在Microsoft C 實作中,long long
類型足以容納兩個 int
值的乘積,而不會溢位。
square
中括住 return
運算式的括號會當做運算式的一部分評估,return
陳述式則不需要括號。
double ratio( int numerator, int denominator )
{
// Cast one operand to double to force floating-point
// division. Otherwise, integer division is used,
// then the result is converted to the return type.
return numerator / (double) denominator;
}
ratio
函式會傳回其兩個 int
引數的比率,做為浮點 double
值。 將其中一個運算式轉換成 double
,return
運算式就會強制使用浮點運算。 否則會使用整數除法運算子,而小數部分將會遺失。
void report_square( void )
{
int value = INT_MAX;
long long squared = 0LL;
squared = square( value );
printf( "value = %d, squared = %lld\n", value, squared );
return; // Use an empty expression to return void.
}
report_square
函式會使用 INT_MAX
的參數值呼叫 square
,這是符合 int
的最大帶正負號整數值。 long long
結果會儲存在 squared
中,然後加以列印。 report_square
函式具有 void
傳回類型,因此其 return
陳述式中沒有運算式。
void report_ratio( int top, int bottom )
{
double fraction = ratio( top, bottom );
printf( "%d / %d = %.16f\n", top, bottom, fraction );
// It's okay to have no return statement for functions
// that have void return types.
}
report_ratio
函式會使用 1
和 INT_MAX
的參數值呼叫 ratio
。 double
結果會儲存在 fraction
中,然後加以列印。 report_ratio
函式具有 void
傳回類型,因此不需要明確傳回值。 report_ratio
執行「垮台」,且不會將任何值傳回給呼叫端。
int main()
{
int n = 1;
int x = INT_MAX;
report_square();
report_ratio( n, x );
return 0;
}
main
函式會呼叫兩個函式:report_square
和 report_ratio
。 由於 report_square
不接受任何參數並傳回 void
,因此我們不會將其結果指派給變數。 同樣地,report_ratio
會傳回 void
,因此我們也不會儲存其傳回值。 在每次呼叫這些函式之後,會在下一個陳述式繼續執行。 然後,main
會傳回 0
值 (通常用來回報成功) 以結束程式。
若要編譯範例,請建立名為 C_return_statement.c
的原始程式碼檔案。 然後,依顯示的順序複製所有範例程式碼。 儲存檔案,並使用以下命令在開發人員命令提示字元視窗中編譯它:
cl /W4 C_return_statement.c
然後,若要執行範例程式碼,請在命令提示字元中輸入 C_return_statement.exe
。 此範例的輸出如下所示:
value = 2147483647, squared = 4611686014132420609
1 / 2147483647 = 0.0000000004656613