這個問題在這里已經有了答案: 從 C 中的非 void 函式回傳任何內容 8 個答案 15 小時前關閉。
ANSI C PROGRAMMING 書(函式基礎部分)指出“當執行通過到達右括號而“脫離函式的末尾”時,控制也回傳給呼叫者,沒有任何值。這不是非法的,但可能是一個麻煩的跡象,如果一個函式從一個地方回傳一個值而從另一個地方沒有值。
一個函式一旦創建了一個回傳值,怎么能在另一個地方不回傳值呢?是否在我在函式內部使用條件陳述句回傳值并且如果條件失敗則不回傳值的情況?
uj5u.com熱心網友回復:
ANSI C 編程書……
ANSI C 標準已失效,除非使用使用它的古老軟體,否則不應使用有關它的書籍。國際標準化組織 (ISO) 和國際電工委員會 (IEC) 目前發布了 C 標準。
函式的回傳型別可以在其范圍之外更改以不回傳任何值嗎?
函式的型別沒有變化。例如,它的型別是“函式回傳int”(并且具有任何引數)。它是否實際回傳值是執行時的行為問題,而不是型別問題。
…當執行到達右括號時,控制也回傳給呼叫者,沒有任何值。這不是非法的,但可能是一個麻煩的跡象,如果一個函式從一個地方回傳一個值而從另一個地方沒有值。
是的,這是允許的。C 2018 6.9.1 12 說:
除非另有說明,否則如果
}到達終止函式的 ,并且呼叫者使用函式呼叫的值,則行為未定義。
因此,一個函式可以通過讓控制流到關閉來完成},只要呼叫者不使用該值,這是由 C 標準定義的。
例如,這允許函式根據情況回傳或不回傳值,例如:
enum Command { Set, Get };
int GetOrSetValue(enum Command Command, int NewValue)
{
static int SavedValue;
switch (Command)
{
case Set:
SavedValue = NewValue;
break;
case Get:
return SavedValue;
}
}
#include <stdio.h>
int main(void)
{
// Set saved value without using function return value.
GetOrSetValue(Set, 4);
// Use function return value ot get saved value.
printf("%d\n", GetOrSetValue(Get, 0));
}
Nonetheless, this aspect of C is rarely used and exists largely to accommodate old software. Good programming practice avoids it in new code, and compiling warnings about reaching the end of a non-void function assist with that.
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/435659.html
上一篇:如何為多載函式宣告模板引數
下一篇:函式不列印兩個單獨的列印陳述句
