C 語言中,如果函數聲明了返回類型,但執行路徑中沒有 return 語句,則返回什么數據值呢?
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值
}
作者QQ4577105

浙公網安備 33010602011771號