C 語言中,如果函式宣告瞭返回型別,但執行路徑中沒有 return 語句,則返回什麼資料值呢?

iZJ"Qq4577105發表於2024-10-23
u8 PID_Ctrl(float setVal,float CurVal)
{
	static unsigned int Cnt = 0;
	static u8 JSVal = 0;
	if(++Cnt >= 100)
	{
		Cnt = 0;
		JSVal = (u8)PID_SF(setVal,CurVal);
		return JSVal;
	}
}

//主函式中存在:
PWM_ZB_Val = PID_Ctrl(60, JRL_Real_Temp);	

Q:當Cnt<100時,PWM_ZB_Val 等於多少呢?

A:

在修改後的程式碼中,如果 Cnt 小於 100,函式 PID_Ctrl 將不會執行 return JSVal; 這一行。這意味著當 Cnt 小於 100 時,函式不會返回任何值。然而,由於函式簽名指定了返回型別為 u8(一個無符號的 8 位整數),函式必須返回一個 u8 型別的值。

在 C 語言中,如果函式宣告瞭返回型別,但執行路徑中沒有 return 語句,那麼函式的行為是未定義的。這意味著如果 Cnt 小於 100,PID_Ctrl 函式將返回一些垃圾值,這個值可能是記憶體中該位置原有的任何值。

所以,當 Cnt 小於 100 時,PWM_ZB_Val 將被賦予一個未定義的值,這個值是不確定的,並且沒有意義。在編寫程式碼時,應該確保所有可能的執行路徑都有明確的 return 語句,以避免這種未定義行為。

所以return JSVal;放在if裡邊,會返回垃圾值,我們應該放在外面,又因為JSVal是靜態的,所以當cnt<100的時候,會返回上一次的JSval值:

u8 PID_Ctrl(float setVal,float CurVal)
{
	static unsigned int Cnt = 0;
	static u8 JSVal = 0;
	if(++Cnt >= 100)
	{
		Cnt = 0;
		JSVal = (u8)PID_SF(setVal,CurVal);
	}
	return JSVal;	//Cnt<100時,返回上一次JSVal值
}

相關文章