2015-10-05 63 views
-2

我学习C语言编程,目前约operators.I'm从sometimes.please问题有点困惑有一个在图像image1c的输出是怎样的53?

的程序是:

#include<stdio.h> 
int main() 
{ 
    int a=9,b=5,c; 
    c=a*b++ + --a; 
    printf("%d",c); 
    return 0; 
} 


我想输出应该是但它显示。因为 - 具有更高的优先级,所以它应该首先被评估,然后在增量之后进行评估,这样在语句终止之后b的值将被改变。我如果我错了)。
请帮助。提前预约。

+1

优先确实在C.不等于评估顺序例如,编译器可能决定首先增加'a',然后评估'a'的两个实例。 – fuz

+0

我没有得到你所说的请详细说明。 –

+1

你从推断评估顺序的推理是错误的。优先级仅告诉编译器在何处放置圆括号,它并不告诉编译器以何种顺序来评估事物。 – fuz

回答

1

这是未指定行为的经典案例。这里没有规定首先应该评估加号运算符的哪一边。

如果首先评估+的左侧,则会得到53,因为--aa*b++之后执行。

如果+运营商的右侧先求值,那么你得到48作为a--执行首次减少a8然后a*b++得到执行产生40

因此,它取决于编译器实现首先评估哪一方,因此它可以在不同的编译器上产生不同的答案。

你可以阅读更多的关于未指定的行为here

0

是奇怪!但是对于你的编译器正在做什么来说,这是一个可能的场景

int a=9,b=5,c; 
/* 
c=a*b++ + --a; // 

*/ 

c =(a * b)++; //乘法然后加法;

编译器使用(a * b)的温度结果然后递增tmp结果(现在无效),结果仍然是45;

然后被其添加到最终结果之前递减

C = 45 +(9-1)= 45 + 8 = 53