知道为什么下面的代码片段打印 2 而不是 3

Any idea why the code snippet below prints 2 and not 3

本文关键字:打印 片段 代码 为什么      更新时间:2023-10-16

我希望这个代码片段打印 3,因为 if 条件为 false 并且 y++ 将执行,但它打印 2,知道为什么......谢谢!!

int x = 3;
int y = 2;
printf("%dn", (x<y) ? x++ : y++);

这打印 2

x++y++是后递增的。也就是说,它们返回变量的当前值,然后向其添加一个。

预增量将是++x++y。这些增量,然后返回新值。

在编写循环控件时,前递增和后递增(和递减)都是有用的东西,这就是 C 支持两者的原因。

(最初,如果我没记错的话,C 只支持前递增和后递减,因为碰巧在它开发的机器上有封装这些行为的指令。但是随着 C 语言迁移到其他系统,并且当人们开始注意到他们想要两者的 pre 和 post,这被普遍化了。

请注意,这意味着c++语言的名称错误。它应该被称为++c - 我们希望在使用它之前对其进行改进,而不是之后!

这是因为y++返回y的值,然后增加它。

如果你放++y它会先增加y的值,然后返回它。

最后

计算++运算符;这称为"后增量"。所以,这个:

int x = 3;
int y = 2;
printf("%dn", (x<y) ? x++ : y++);

相当于这个:

int x = 3;
int y = 2;
printf("%dn", (x<y) ? x : y);
y++;

(由于三元条件,x++永远不会达到。另一方面,这:

int x = 3;
int y = 2;
printf("%dn", (x<y) ? ++x : ++y);

在将其各自的值返回给 printf() 之前递增y,因此逻辑将是:

printf("%dn", (3<2) ? 3 : 3); // prints 3

由于您使用后递增y++,因此将首先使用y的值并递增。也就是说,printf将在增量操作之前传递值,在您的情况下y增量之前为 2,将打印 2。

在完成此行的所有其他操作后,您应该考虑 x++ 和 y++。因此,打印 y,然后递增 x 和 y。