首先从一段代码说起:
if(Cnt_Worktostandby >((g_SaftyConfig.bit.FreChgDisPowerEnable||g_SaftyConfig.bit.VGridDeratingChargeEnable)?45000:1500))
这里面就涉及到一个很基本的C语言的三目运算。分解开来就是如果g_SaftyConfig.bit.FreChgDisPowerEnable||g_SaftyConfig.bit.VGridDeratingChargeEnable)为真,则后面的括号的整体就取45000,如果g_SaftyConfig.bit.FreChgDisPowerEnable||g_SaftyConfig.bit.VGridDeratingChargeEnable)为假,则取1500.
下面是一些关于三目运算的笔记。
笔记的主体来自blog:
https://www.cnblogs.com/jialiangliang/p/5990581.html
三目运算符
语法:
表达式1 ? 表达式2 : 表达式3;
语义:
先执行表达式1,执行完毕,表达式1的结果如果为真,那么执行表达式2,并且这个整体的运算式的结果是表达式2的结果,否则执行表达式3,运算式的结果是表达式3的结果。
跟
if(表达式1){
表达式2;
}else{
表达式3;
}
用一个口水化来表达三目表达式:
表达式1 ? 表达式2 : 表达式3;
表达式1成立吗?成立执行表达式2,否则执行表达式3
所以,在当需要使用
if(条件句)
{
表达式1;
}
else
{
表达式2;
}
的时候,就可以使用三木运算使代码尽可能的简洁美观了。
这个时候就应该是
(条件句)?(表达式1):(表达式2)
比如很多时候会遇到如果某个变量大于0,则不变,如果小于0,则取反。除了可以使用abs和fabs等绝对值函数,或者if判断,还可以用三目运算。
eg:
g_i32ExternalPvPower = getCANMessage(CAN_RX_MSG_OBJ);
g_i32ExternalPvPower = g_i32ExternalPvPower*0.1; //单位转换成W;
if(g_i32ExternalPvPower < 0)
{
g_i32ExternalPvPower = -g_i32ExternalPvPower;
}
还可以写成:
g_i32ExternalPvPower = (g_i32ExternalPvPower>0)?g_i32ExternalPvPower:(-g_i32ExternalPvPower);
or
g_i32ExternalPvPower = g_i32ExternalPvPower>0?g_i32ExternalPvPower:-g_i32ExternalPvPower;