无法理解 x *= y+1 的输出结果

4

我不太理解这段代码的输出结果,请给予解释...

#include<stdio.h>
void main()
{
     int x=2,y=5;
     x*=y+1;
     printf("%d",x);
}

输出结果为12。但根据我的理解,x*=y+1;应该是x=x*y+1;,但根据运算符优先级,应该先计算x*y,然后再加1,因此结果应该是10+1=11。但实际上是12 — 有人能解释一下吗?

4
应该写成int main(void),而不是void main() - Keith Thompson
@Aashu:他使用哪个编译器并不重要。代码的行为是正确的,没有任何编译器会出错。 - Keith Thompson
2
@KeithThompson:除了Windows系统外,由于printf()末尾缺少换行符,这可能是它被运行的地方。是的,应该是int main(void),但MS允许使用void main() - Jonathan Leffler
2
这是一个重复的问题;难点在于找到(最佳的)重复项。 - Jonathan Leffler
@JonathanLeffler:没错——但我并没有完全说void main()是不正确的。它很丑,而且它的母亲给它穿得很滑稽,所有有思想的人都应该避免使用它,但它并不是不正确的。 - Keith Thompson
显示剩余3条评论
9个回答

13

它将被评估为

x = x * (y + 1);

所以

x = 2 * ( 5 + 1 )
x = 12

感谢您的解释。 - shashank

10

这里发生的是程序中操作顺序的问题。

如果你有方程 x*y+1,它应该是 (x * y) + 1 并得出十一。

但是在编程中,在等号右侧的方程会先被解析,然后再由等号左侧的符号进行修改。 在这个方程中,是乘。

因此,x *= y + 1 实际上是 x = x * (y + 1),结果为12。
^ 在这种情况下,星号(*) 将右侧整个方程乘以 x,然后将 那个 结果分配给 x


1
+1 这应该是答案。因为它解释了求值顺序的原因。 - Jayesh Bhoi

2

它被翻译成:x = x*(y+1);

所以很明显它输出12。


1
您的理解是正确的,但实际情况是这样的:
x*=y+1;  =>  x = x * (y + 1);

现在应用BODMAS

BO代表左括号,D代表除以,M代表乘以,A代表加,S代表减。这是一个解决语句的顺序。 - AmanVirdi
我怀疑编程语言是否每次都遵循BODMAS规则。 - nobalG
它能帮助像我这样的初学者,以简单易懂的方式理解。 - AmanVirdi

1

x *= y + 1 的意思是 x = x * (y + 1)

运算符+的优先级高于运算符*=


1

x*=y; 的作用类似于 x=x*y;x*=(y+1) 的展开形式为 x = x * (y + 1);


0

在 C 语言中,您可以从 运算符过程 中看到以下内容:

加/减赋值 的优先级低于简单的操作。

因此,在这里:

x*=y+1;

+会首先执行。

所以:

x = x * (6)

所以 x = 2 * 6

x = 12;

0

*=和类似的运算符是C赋值运算符的一种,即这些运算符与*等不同。

现在根据C运算符优先级,这些运算符具有最低的优先级(高于,),因此将首先计算y + 1,然后计算*=并将结果分配给x


0

它的评估结果为

x = x * (y + 1);

所以

x = 2 * (5 + 1) = 12

看一下运算符顺序,你就会明白为什么在这种情况下它被评估为那样。


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