【问题标题】:What is this code block doing ? (u > 0) - (u < 0)这个代码块在做什么? (u > 0) - (u < 0)
【发布时间】:2015-06-13 20:51:29
【问题描述】:
if (abs(u) > Vdc)
    u = Vdc*((u > 0) - (u < 0));

这段代码在 C 中 考虑到我们进入 if 条件会发生什么? 直流电压 = 24; 考虑 u 的任意值来解释

【问题讨论】:

  • 这是从 bool 到整数的隐式类型转换。您会看到,您将始终为正值,并且可能大于 Vdc。 U 最终等于 Vdc * (1 (true) - 0))。实际上,它是 u = Vdc 的简写版本。
  • @Poriferous 这不是真的。 u 可以是负数(假设它被声明为有符号整数)。
  • 当然u 最好是int 或更窄的有符号整数,否则返回intabs(u) 是个问题。 u == INT_MIN 是个问题。使用 if (u &gt; Vdc) u == Vdc else if (u &lt; -Vdc) u = -Vdc; 的代码会更清晰 - 也许没有那么快。
  • abs(u) 意味着你永远是积极的;这是绝对值。因此,if 语句始终为真。因为 u 始终大于 0(始终为正),所以它始终为 1。然而这不是 u

标签: c ansi-c


【解决方案1】:

如果u &gt; 0,语句将变为1 - 0 (true - false) = 1。如果u &lt; 0 将变为-1。如果为零,它也将变为0。所以基本上它是返回 u 的“符号”(或更准确地说是 1 和相应的符号)。整个代码 sn-p 用于将 u 夹在 +Vdc-Vdc 之间。 (如建议的那样,它仅适用于积极的Vdc)。

【讨论】:

  • 值得注意的警告是Vdc 必须是积极的,这才是真的。如果Vdc 为负数,则u 将落入所有实数的集合中。
  • @mstbaum 谢谢,添加了注释。
  • 请注意,如果u == INT_MIN 由于abs(u) 可能返回负值,则可能不会发生钳位。
  • 实际上我想修改我的评论。如果Vdc 是负数,那么u 在这个sn-p 之后只能等于+/-Vdc
  • @mstbaum 这仍然是有效的评论,因为代码显然不是为这种情况设计的
【解决方案2】:

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

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

这就是它的工作原理:

按照 C 标准第 6.5.8 节关系运算符

如果指定的关系为真,则返回 1,如果为假,则返回 0。结果的类型为 int。

现在如果 u 大于 0,则 u &gt; 0 返回 1,u &lt; 0 返回 0。1-0 为 1,例如任何大于 0 的u 都转换为 1。类似地,任何小于 0 的u 都转换为 -1。

【讨论】:

    【解决方案3】:

    这是一种对函数进行建模的技术

        |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
    

    【讨论】:

      【解决方案4】:

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

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

      因为第一个条件为真,第二个条件为假。 u &lt; 0 的情况也是如此。

      【讨论】:

        猜你喜欢
        • 2015-12-04
        • 1970-01-01
        • 2012-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-08
        相关资源
        最近更新 更多