if (abs(u) > Vdc)
u = Vdc*((u > 0) - (u < 0));
考虑到我们输入 if 条件,这段代码在 C 中会发生什么?直流电压 = 24;考虑 u 的任意值来解释
如果u > 0
语句将变为1 - 0
(true - false) = 1
。如果u < 0
会变成-1
. 如果它为零,它也将变为0
。所以基本上它是返回的“符号” u
(或更准确地说1
是带有相应的符号)。整个代码片段用于夹u
在+Vdc
和之间-Vdc
。(如建议的那样,它仅适用于 positive Vdc
)。
括号中的表达式是符号函数。如果u > 0
成立,则表达式变为
(u > 0) - (u < 0) -> 1 - 0 -> 1
因为第一个条件为真,第二个条件为假。同样的u < 0
情况。
这是一种对函数进行建模的技术
|0, if u = 0
f= |1, if u > 0
|-1, if u < 0
它避免使用 if 子句进行此比较,并像这样进行评估
//For positive values of u
(u>0) - (u<0) = 1 - 0 = 1
//For negative values of u
(u>0) - (u<0) = 0 - 1 = -1
//For u = 0
(u>0) - (u<0) = 0 - 0 = 0
这是数学函数Sign 它的值是
这是它的工作原理:
根据 C 标准第 6.5.8 节关系运算符
如果指定的关系为真,则应产生 1,如果为假,则应产生 0。结果的类型为 int。
现在如果 u 大于 0 则u > 0
返回 1 并u < 0
返回 0。1-0
是 1,例如,任何u
大于 0 的都转换为 1。类似地,任何u
小于 0 的都将转换为 -1。