3

我只是对条件运算符有一个简短的问题。这里仍然是一个初出茅庐的程序员。我得到 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-- 变为零)作为可能性。任何帮助深表感谢。:)

4

13 回答 13

10

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

这里查看详细信息。重要的是要记住一件简单的事情:当您说x ++使用 x 的当前值时,会递增。当您说它++x首先递增然后使用时。

于 2010-05-19T18:37:50.503 回答
7

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

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

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

于 2010-05-19T18:42:14.997 回答
6

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

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

在您的情况下,因为xis 1,您将采用此 if 语句的“真实”方面。这意味着您正在添加z++y给予3 + 2、 导致5

请不要写这样的代码。

于 2010-05-19T18:40:06.870 回答
1

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

于 2010-05-19T18:40:41.440 回答
0

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

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

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

因为y = 2y += 35

于 2010-05-19T18:39:52.110 回答
0

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

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

于 2010-05-19T18:40:34.313 回答
0

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

特别是,当x--被计算时,它减x1,但返回的未修改值x,在本例中为 1。在 C 中,1 计算为真,因此三元运算符将返回z++

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

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

于 2010-05-19T18:40:37.323 回答
0

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

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

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

于 2010-05-19T18:41:47.650 回答
0

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

于 2010-05-19T18:42:17.603 回答
0

该表达式的x--计算结果为 的当前值x,即 1。因此,条件表达式的结果为z++,其计算结果为 3。3 与 相加y,总共为 5。

于 2010-05-19T18:45:48.947 回答
0

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

于 2010-05-19T18:47:42.643 回答
0

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

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

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

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

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

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

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

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

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

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

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

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

于 2013-07-20T14:57:52.480 回答
0

众所周知,运营商会检查条件是否true i.e 1执行真实的语句。

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

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

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

于 2014-10-26T10:59:53.217 回答