代码之家  ›  专栏  ›  技术社区  ›  Seephor

C问题中的条件运算符

  •  3
  • Seephor  · 技术社区  · 14 年前

    我有一个关于条件运算符的快速问题。还是一个初出茅庐的程序员。 给我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——变为0)是可能的。任何帮助都非常感谢。:)

    13 回复  |  直到 10 年前
        1
  •  10
  •   nc3b    14 年前

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

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

        2
  •  7
  •   Maciej Hehl    14 年前

    接线员?:优先级高于运算符+=。所以你的表达式被计算为

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

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

        3
  •  6
  •   Carl Norum    14 年前

    把它分解成类似的 if 声明:

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

    在你的情况下,因为 x 1 ,您将采用if语句的“true”部分。这意味着你在增加 z++ y 给予 3 + 2 导致 5 .

    请不要这样写代码。

        4
  •  1
  •   Trevor Tippins    14 年前

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

        5
  •  0
  •   John Ledbetter    14 年前

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

    1. 递增或递减变量
    2. 返回 起初的 价值。

    所以它的返回值 X—— 是1,表示为真,所以 z++ 被计算,返回原始值3。

    自从 y = 2 , y += 3 5 .

        6
  •  0
  •   Shravan    14 年前

    x——表示表达式是以x的当前值计算的,然后x被减少1。Z++的情况也是如此。这是--z的另一种方法,这意味着它是以z的新值来计算的。

    所以在评估时,x是1,z是3。在计算表达式x之后,x变为0,z为4;y=2+3=5

        7
  •  0
  •   Syntactic    14 年前

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

    尤其是当 x-- 被评估,它减少 x 1岁,但 收益率 未修改的值 X ,在本例中是1。在C中,1的计算结果为true,因此三元运算符将返回 z++ .

    另外,由于++运算符放在变量之后,因此 Z++ 是的未修改值 z ,这是3。

    因此,这可以归结为 y += 3 从而导致 y 5岁。

        8
  •  0
  •   agent oranje    14 年前

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

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

    --从未调用z,条件的计算结果为true,并执行三元运算符中的第一个选项。使用后,x将递减,z将递增。

        9
  •  0
  •   Incognito    14 年前

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

        10
  •  0
  •   John Bode    14 年前

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

        11
  •  0
  •   Otiel user577803    13 年前

    我认为你最根本的问题是你假设 y+= x-- 是你的状况,而实际上你的状况只是 x-- . 有来自条件运算符的返回,它使 y += 条件运算的结果: x-- ? z++ : --z; 是5。其他评论也有其实际评估结果为5的原因。

        12
  •  0
  •   Lee Taylor Dejan.S    11 年前

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

    正如我们所知道的,像x或x++之类的东西被称为后递增或后递减。因此,根据后增或后减的规则,首先对表达式进行计算,然后只对表达式进行增或减操作。即首先评估,然后增加或减少……

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

    y+= x?Z++:--Z……现在它包含了左、中、右三个部分……现在的考虑点是:“如果左部分是真的,那么它将返回中间部分,否则右部分……并且执行总是从左部分开始,因为它是条件部分。”

    现在将语句简化为:y+=x?z:z;….现在查看左部分是否有前、后增量或减量…..如果post++/--是der den,首先评估简化语句……den go for++/--…..

    现在左边部分有后减量……所以让我们先计算表达式……即

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

    所以现在我们的条件是真的,它将返回中间部分,当控件转到中间部分时,只有x值会减小,即它变为0…。

    现在,第二个简化语句是y+=z.(\\由于条件为真,我们得到了中间部分,编译器将跳过部分的其余部分,即右部分。)

    现在观察z是post++/-(or)pre++/-)…hahh..它的post increment..所以简单地首先评估简化的状态2,然后增加z的值……,即

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

    现在表达式被计算为y=5,所以现在增加z的值,即它变成4。

        13
  •  0
  •   Marcin Nabiałek    10 年前

    如我们所知,操作员检查条件 true i.e 1 它执行真语句。

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

    因为我们正在初始化 x to 1 它执行 true 陈述

    结果它暴露了结果 5 从真部分 y=(y+z++)