【问题标题】:Can you help me break down what this code is actually doing? if ((a = b > c ? d : e) == e) a++; [closed]你能帮我分解这段代码实际上在做什么吗?如果 ((a = b > c ? d : e) == e) a++; [关闭]
【发布时间】:2023-03-18 13:55:01
【问题描述】:
int a = 2, b = 3, c = 5, d = 4, e = 1;

if ((a = b > c ? d : e) == e) a++;

答案是 a=2

我不明白这实际上在做什么。

你能帮我逐步弄清楚这段代码的作用吗?

【问题讨论】:

  • 学习优先规则,我的孩子。研究它们。与他们合而为一。只有这样,你才能获得真正的开悟。

标签: c++ c syntax ternary-operator


【解决方案1】:
if ((a = b > c ? d : e) == e) a++;

等于:

if (b > c)
    a = d;
else
    a = e;
if (a == e)
    a++;

也可以看看:What does '?' do in C++?

【讨论】:

    【解决方案2】:

    要理解你必须组合 if 条件。

    如果 ((a = b > c ? d : e) == e) a++;

    先有作业

    a = b > c ? d : e

    它说:如果 b > c 然后 a = d,否则 a = e

    在这种情况下 3 > 5 是假的所以

    a = e 所以a = 1

    然后有另一个评价

    如果(a==e) a++;

    在这种情况下 a = e = 1 所以它是 a++ -> a = 2

    希望对你有帮助;)

    【讨论】:

    • 只是一个小问题(因为您的逻辑实际上是正确的):分配是 second - 首先评估三元。
    • 感谢您的澄清;)
    【解决方案3】:
    int a = 2, b = 3, c = 5, d = 4, e = 1;
    
    if ( (a = ( (b > c) ? d : e )) == e ) a++;
    
    1. b > c 返回false
    2. false ? d : e 返回 e1
    3. a = 11 分配给 a 并返回 a
    4. 1 == etrue
    5. if (true) a++;1 递增 a

    所以a最后等于2

    【讨论】:

      【解决方案4】:

      首先,所谓的三元运算符(带有 ? 标记)检查条件 (b>c):

      a= b > c ? d : e
      

      并将值e 分配给变量a(因为条件失败,它采用了第二个选项),所以,a=1

      然后它检查变量a是否等于e(它是true)并相应地将变量a增加1,所以它变成了2

      注意:看起来对你来说最关键的部分是学习C中的三元运算符和运算优先级。

      【讨论】:

        【解决方案5】:

        我认为这是你想知道的主要地点

        一个? b : c 称为条件运算符,表示如果 a 为真则使用 b,否则使用 c。

        (a = b> c? d : e) 
        

        正好等于

        if(b>c)
          a = d;
        else 
          a = e;
        

        【讨论】:

          【解决方案6】:

          首先,如果我们在这段代码执行后查看变量,看起来并没有发生太多事情。但这是真的吗?

          嗯,LiHo 已经展示了对此的分解以及它如何“转换”为更易于阅读的代码,并且使用他的代码,应该很容易看到正在发生的事情。但只是为了好玩,让我们根据给定的数字分解那个东西并运行它,好吗?

          if ((a = b > c ? d : e) == e) a++;
          

          格式如下:

          if(<something> == e) a++;
          

          我们知道这意味着什么。所以,让我们关注&lt;something&gt; 部分:

          (a = b > c ? d : e)
          

          查看C++ operator precedence list,我们看到三元运算符 (?:) 的排名高于 =,因此它将首先评估:

          b > c ? d : e
          

          这是一个美化的if 声明:“如果b 大于c,则返回d,否则返回e。我们有bc 的值,我们也知道3不大于5。所以,我们知道这条语句会返回e

          所以现在,我们稍微简化了表达式:

          (a = e)
          

          这是一个任务。它将a 设置为等于e。现在,我们将退出以获取更多上下文:

          if((a = e) == e) a++;
          

          这里发生的是 操作 (a = e) 被执行后,它给了我们一个结果。方便地,该结果是a 赋值之后的值。因此,我们有这样的:

          if(a == e) a++;
          

          由于我们已将a 设置为等于e(即等于1),因此if 将执行并且a++a1 增加到2

          因此,虽然 似乎 好像什么都没发生,但实际上,我们已经完成了 很多 的工作。

          【讨论】:

            猜你喜欢
            • 2012-01-27
            • 1970-01-01
            • 2014-01-12
            • 2015-08-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-07-28
            • 2013-06-23
            相关资源
            最近更新 更多