在下面的代码中,我试图用增量运算符添加数组的两个元素,但我得到的输出和是错误的。如果我在代码中有任何错误,请帮助我
#include <stdio.h>
int main(void) {
int a[2];
int top=-1;
a[++top]=10;
a[++top]=20;
printf("a0 is %d n",a[0]);
printf("a1 is %d n",a[top]);
printf("value of sum is %d n",a[top]+a[--top]);
}
最后一行的输出应该是30作为I,并将数组中的两个值相加。但是我得到的输出如下
a0 is 10
a1 is 20
value of sum is 20
您的程序有未指定的行为。在表达式a[top]+a[--top]
中,C和c++语言标准没有规定a[top]
和a[--top]
中哪一个先求值,也没有规定--
运算符相对于其他表达式何时执行。编译器可以根据它们认为合适的情况对其进行计算。首先计算--top
,将top
设置为0,然后计算a[0]+a[0]
,结果为20。
不要在对一个变量进行前递增、后递增或自减的表达式中使用该变量两次。
要理解为什么会发生这种情况,请更改最后一个printf,将top
和总和打印在一行中,如下所示:
printf("top is %d and the value of the sum is %d n",top,a[top]+a[--top]);
尝试计算并打印
int y1 = a[top];
int y1 += a[--top];
top = 1;
int y2 = a[top] + a[--top];
这个可以帮助你。关键是执行[——top];在你的代码中是在执行[top]之前完成的,因为它们没有指定。
这里,在这一行中:
printf("value of sum is %d n",a[top]+a[--top]);
由于——top, top再次变为0(——top为——1)。然后将a[0]和a[0]相加,它没有给出预期的输出。我认为这是由于——操作符的优先级高。
如前所述,最好分别计算,然后再打印。
PS:如果上面有任何错误或不完全正确,请告诉我。我喜欢从错误中学习