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值
}

 

posted @ 2024-10-23 16:39  iZJ"Qq4577105  阅读(7)  评论(0编辑  收藏  举报