【问题标题】:conditional operator in C questionC问题中的条件运算符
【发布时间】:2011-02-21 12:52:38
【问题描述】:

我只是有一个关于条件运算符的快速问题。这里仍然是一个初出茅庐的程序员。 我得到 x = 1、y = 2 和 z = 3。

我想知道,为什么在这句话之后:

y += x-- ? z++ : --z;

即 y 为 5。语句后的值为 x = 0、y = 5 和 z = 4。 我知道条件运算符的工作方式是它的格式如下: 变量=条件?真值:假值。

对于条件 y += x-- ,y 是如何变成 5 的?我只能看到 2 (2 += 0) 和 3 (2 += 1)(然后 x-- 变为零)作为可能性。任何帮助深表感谢。 :)

【问题讨论】:

  • 哇,我离开5分钟,已经有这么多答案了。现在很有意义。感谢所有的答案!我一定会记得永远不要这样写:)
  • 我觉得有趣的是,几乎每个人都认为这个问题是关于 x 令人困惑的递减后问题,而不是实际问题,即 += 和 ?: 之间的优先级令人困惑......

标签: c conditional ternary-operator operator-keyword


【解决方案1】:

当它评估条件 (x != 0) 时,x 仍然是 1(即 not 0)。所以它选择z++。仍然是 3。2 + 3 = 5。在一天结束时,x 变成了 0,z 变成了 4。

查看here 了解详情。记住一件简单的事情很重要:当你说x ++ 时,x 的当前值被使用,然后它被递增。当您说 ++x 时,它首先递增并然后使用。

【讨论】:

    【解决方案2】:

    运算符 ?: 的优先级高于运算符 +=。所以你的表达式被评估为

    y += (x-- ? z++ : --z);
    

    x-- ? z++ : --z 表达式的值是表达式 z++ 的值(即 3),因为表达式 x-- 的值是 1

    【讨论】:

    • +1 实际回答了困惑。优先于 ?: 永远不应该被认为是理所当然的。
    【解决方案3】:

    只需将其分解为类似的if 语句:

    if (x--)
        y += z++;
    else
        y += --z;
    

    在您的情况下,由于 x1,您将采用此 if 语句的“真实”方面。这意味着您将z++ 添加到y,得到3 + 2,得到5

    请不要这样写代码。

    【讨论】:

    • 像什么?喜欢你的还是喜欢他的?
    • @Dervin,喜欢他的。但是这个稍微扩展的版本也不是很好。
    • 是的,赞成。使用 ifs 是一个有趣的教学建议。
    • 您必须小心使用 if 语句版本,因为它在语义上并非 100% 相同。在大多数情况下,这有助于了解正在发生的事情。
    【解决方案4】:

    作为一个初出茅庐的程序员只知道你不应该写这样的东西,这样你就可以忘记它让你担心!

    【讨论】:

    • 除非您只从事单独的项目,否则您可能仍会遇到来自其他开发人员的此类代码。
    • 我知道。我在开玩笑。其他人已经非常简洁地回答了OP的询问。
    【解决方案5】:

    原因是后自减/自增运算符(x++x--)执行以下操作:

    1. 增加或减少变量
    2. 返回原始值。

    所以x--的返回值为1,表示为真,所以z++语句被求值,返回原始值3。

    由于y = 2y += 35

    【讨论】:

      【解决方案6】:

      x-- 表示表达式在 x 的当前值处计算,然后 x 减 1。Z++ 也是如此。这与 --z 是相反的,这意味着这是在 z 的新值上进行评估的。

      所以在求值时 x 为 1,z 为 3。表达式 x 求值后变为 0,z 为 4;和 y = 2 + 3 = 5

      【讨论】:

      • +1 表示不要编写这样的代码。这是您应该注意的事情
      【解决方案7】:

      请记住,递增和递减运算符返回不同的内容,具体取决于它们是放在变量名称之前还是之后。

      特别是,当计算x-- 时,它会将x 减1,但返回x 的未修改值,在这种情况下为1。在C 中,计算1为 true,因此三元运算符将返回 z++

      再一次,因为++运算符放在变量后面,z++的返回值是z的未修改值,即3。

      因此,这归结为 y += 3,导致 y 为 5。

      【讨论】:

        【解决方案8】:

        x-- 和 z++ 在使用后自增自增。当计算三元运算符时,您会得到以下结果:

        y += (1) ? (3) : (--z);

        --z 永远不会被调用,条件评估为真并执行三元运算符中的第一个选项。使用后,x递减,z递增。

        【讨论】:

          【解决方案9】:

          这是正常的,因为它首先“运行”三元运算符然后进行减量,因为减量运算符 (x--) 是后缀,所以你得到了 z++,它是 3,所以你在 y 中有 5。

          【讨论】:

            【解决方案10】:

            表达式x-- 的计算结果为x 的当前值,即1。因此,条件表达式的结果为z++,其计算结果为3。3 被添加到y,总计5 个。

            【讨论】:

              【解决方案11】:

              我认为您的根本问题是您假设y+= x-- 是您的条件,而实际上您的条件仅仅是x--。条件运算符有一个返回,这使得y += 成为条件运算的结果:x-- ? z++ : --z; 是 5。其他 cmets 有它实际计算为 5 的原因。

              【讨论】:

              • 我认为问题在于他假设x-- == 0,从他的2 += 0 等价性判断。
              【解决方案12】:

              y += (x-- ? z++ : --z);所以这是你的问题,答案很简单......

              我们知道像 X-- 或 x++ 这样的东西被称为后递增或递减。因此,根据后递增或递减的规则,表达式将首先被评估,然后只有递增或递减才会生效。即先评估,然后增加或减少.....

              现在让我们来解决您的问题:

              Y+=X--?Z++:--Z....现在它包含三个部分,即左、中和右...现在考虑的重点是:“如果左部分为真,那么它将返回中间部分,否则右侧部分......并且执行总是从左边部分开始,因为它是条件部分”

              现在将语句简化为:Y+=X?Z:Z;....现在看看左边的部分是否有前或后增量或减量.....如果后 ++/-- 是 der den 首先评估简化语句......den go for ++/--.....

              现在左边部分有后减...所以让我们首先评估表达式...即

              y+=1:3:3 //条件部分的任何非零值都是真条件(即1)

              所以现在我们的条件为真,它将返回中间部分,当控制进入中间部分时,只有 x 值将减少,即变为 0....

              现在第二个简化语句是 Y+=Z。 (\\因为条件为真,我们得到了中间部分,编译器将跳过其余部分,即正确的部分。)

              现在观察 Z 是否是后 ++/-- (或)前 ++/--) ...hahh..它的后增量 ..所以只需首先评估简化语句 2,然后增加 Z 的值。 ...即

                                   Y+=Z =>Y=Y+Z
                                  =>Y=2+3 =>y=5
              

              现在表达式被计算,即 Y=5,所以现在增加 Z 的值,即它变为 4

              【讨论】:

                【解决方案13】:

                据我们所知,操作员检查条件是否为true i.e 1,它会执行正确的语句。

                如果是false i.e 0,则执行错误语句

                我们正在初始化x to 1的值,它执行true语句

                因此,它会从真实部分 y=(y+z++) 公开结果 5

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-12-20
                  • 2011-08-13
                  • 2015-05-20
                  • 2013-06-20
                  • 2021-10-01
                  • 2015-07-12
                  • 2023-04-03
                  相关资源
                  最近更新 更多