C语言中的条件运算符问题

3

我是一名初学者,对于条件运算符有一个快速的问题。我已经有了 x=1,y=2 和 z=3。

我想知道,在执行以下语句后为什么结果是这样的:

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

那么y等于5。语句执行后,x = 0,y = 5,z = 4。 我知道条件运算符的工作方式是这样格式化的: variable = condition ? value if true : value if false。
对于条件y += x--,y如何变为5?我只能看到2(2+ = 0)和3(2+ = 1)(然后x--变为零)作为可能性。非常感谢您的帮助。 :)

哇,我离开了5分钟,就已经有这么多答案了。现在很有道理了。感谢所有的回答!我一定会记住永远不要写成这样 :) - Seephor
1
我觉得很有趣的是,几乎每个人都认为问题在于对 x 进行后减操作不清楚,而实际上问题是 += 和 ?: 之间的优先级令人困惑... - Brian Postow
13个回答

10

当条件语句被执行时 (x != 0),x仍然是1(也就是非0)。因此它选择了z ++,这仍然是3。2 + 3 = 5。最终x变成了0,z变成了4。

详见这里。重要的是要记住一个简单的事实:当你使用x ++时,会首先使用当前值并且 然后 对其进行增量操作。而当你使用++x时,会首先增加其值再 然后 使用。


7
运算符“?:”比运算符“+=”的优先级高。因此,您的表达式被评估为
y += (x-- ? z++ : --z);
< p > x-- ? z++ : --z表达式的值是表达式z++的值(即3),因为表达式x--的值为1。


2
+1 针对解惑的答案。不要想当然地使用 ?: 运算符的优先级。 - Brian Postow

6

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

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

在您的情况下,由于x1,因此您将使用此if语句的“true”部分。这意味着您正在将z ++添加到y,从而得到3 + 2,结果为5
请不要编写此类代码。

像什么?像你的还是像他的? - Dervin Thunk
@Dervin,像他的那样。但是这个稍微扩展的版本也不太好。 - Carl Norum
使用if语句是一个有趣的教学建议。是的,已点赞。 - Dervin Thunk
你必须小心使用if语句版本,因为它并不完全语义相同。在大多数情况下,理解正在发生的事情是有帮助的。 - Carl Norum

1
作为一名新手程序员,请记住,永远不要编写像这样的任何内容,这样你就可以忘记它,不用担心!

除非你只从事独立项目,否则你仍然可能会遇到其他开发者编写的这种代码。 - R Samuel Klatchko
我知道。我只是在开玩笑。其他人已经非常简洁地回答了OP的问题。 - Trevor Tippins

0

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

我们知道像 X-- 或 x++ 这样的东西被称为后缀递增或递减。根据后缀递增或递减的规则,表达式将首先进行评估,然后才会执行递增或递减操作。即先评估再增加或减少.....

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

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

现在简化一下语句:Y+=X?Z:Z;....现在看看左侧部分是否有前缀或后缀递增或递减.....如果有 post ++/--,则先评估简化的语句......然后再去执行 ++/--.....

现在左侧部分具有后缀递减...所以先评估表达式...即

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

现在我们的条件为真,它将返回中间部分,当控制流到达中间部分时,只有x值会递减,即变为0...

现在第二个简化语句是Y+=Z。(由于条件为真并且我们得到了中间部分,编译器将跳过右侧部分。)

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

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

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


0

正如我们所知,运算符检查条件是否为true即1,如果是,则执行true语句。

如果是false即0,则执行false语句。

由于我们将x的值初始化为1,因此它执行true语句。

结果从true部分y=(y+z++)中公开了结果5


0

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

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

因此,x-- 的返回值为 1,表示为真,因此语句 z++ 被计算,返回原始值 3。

由于 y = 2,所以 y += 35


0

x-- 表示表达式在当前 x 值处被计算,然后 x 减 1。Z++ 的情况也是如此。对于 --z,情况则相反,它表示在 z 的新值处进行计算。

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


+1 不要写这样的代码。虽然如此,你还是应该意识到这一点。 - Shravan

0
请记住,根据变量名称前后放置的位置,递增和递减运算符返回不同的值。
特别地,在评估--时,它将使减1,但是返回 x 的未修改值,这种情况下为1。在C语言中,1代表真,因此三元运算符将返回z ++
因为++运算符放置在变量后面,所以z ++的返回值是 z 的未修改值,即3。
因此,y += 3,结果为y为5。

0

x--和z++在使用后才递减和递增。当三元操作符被评估时,你得到以下结果:

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

--z从未被调用,条件为真并执行三元操作符中的第一个选项。在使用后,x递减,z递增。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接