这个代码块在做什么? (u > 0) - (u < 0)

What is this code block doing ? (u > 0) - (u < 0)

if (abs(u) > Vdc)
    u = Vdc*((u > 0) - (u < 0));

此代码为 C 语言 考虑到我们进入 if 条件会发生什么? Vdc = 24; 考虑 u 的任意值作为解释

括号内的表达式为符号函数。 如果 u > 0 成立,则表达式变为

(u > 0) - (u < 0) -> 1 - 0 -> 1

因为第一个条件为真,第二个为假。 u < 0 案例也是如此。

如果 u > 0 语句将变为 1 - 0 (true - false) = 1。如果 u < 0 它将变为 -1。如果它是零,它也会变成 0。所以基本上它返回 u 的 "sign" (或者更准确地说 1 带有相应的符号)。整个代码片段用于将 u 夹在 +Vdc-Vdc 之间。 (如建议的那样,它仅适用于正数 Vdc)。

这是一种函数建模技术

    |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 它的值为

  1. 1 如果你 > 0
  2. 0 如果你 = 0
  3. -1 如果你 < 0

这是它的工作原理:

根据 C 标准第 6.5.8 节关系运算符

shall yield 1 if the specified relation is true and 0 if it is false. The result has type int.

现在如果 u 大于 0 那么 u > 0 returns 1 和 u < 0 returns 0。1-0 是 1,例如任何大于 0 的 u 都转换为 1。类似地,任何小于 0 的 u 都转换为 -1。