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

时间:2015-04-08 18:21:10

标签: c ansi-c

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

此代码位于C中 考虑到我们进入if条件会发生什么? Vdc = 24; 考虑任何任意的u值来解释

4 个答案:

答案 0 :(得分:7)

如果u > 0语句将变为1 - 0(true - false)= 1。如果u < 0它将成为-1。如果它为零,它也将变为0。所以基本上它正在返回&#34;标志&#34; u(或更确切地说1具有相应的符号)。整个代码段用于在u+Vdc之间限制-Vdc。 (如建议的那样,它仅适用于积极的Vdc)。

答案 1 :(得分:5)

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

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

因为第一个条件为真,第二个条件为假。 与u < 0案例相同。

答案 2 :(得分:2)

这是一种模拟函数的技术

    |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

答案 3 :(得分:2)

这是数学函数Sign 它的价值是

  1. 1,如果你&gt; 0
  2. 0如果u = 0
  3. -1如果你&lt; 0
  4. 这是它的工作原理:

    根据C标准6.5.8关系运算符

      如果指定的关系为真,则

    应为1,如果为假,则为0。结果的类型为int。

    现在,如果u大于0,则u > 0返回1而u < 0返回0. 1-0为1,例如大于0的任何u转换为1.同样,任何小于0的u都会转换为-1。