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