C语言表达式问题

来源:百度知道 编辑:UC知道 时间:2024/05/27 13:57:37
#include <stdio.h>

int main(int argc, char *argv[])
{
int i=8;
printf("%d %d %d %d %d %d %d",i,i++,i--,++i,--i,-i++,-i--);
getchar();
return 0;
}

输出:
8 7 8 8 7 -7 -8

请问这是怎么一回事?
感谢各位的回答!
我还有个疑问:
printf是__cdecl还是__stdcall方式调用?



在这个情况中,函数printf的参数(那些i,i++,i--)是从右往左计算的。
i,i++,i--,++i,--i,-i++,-i--
<--<--<--<--<--<--<--<--<--

还有,以后少些这种表达式...
不同情况会有不同结果

一楼说的太好了,就是从最后一个开始运算的

从右往左运算,-i--所以先计算-i--,--运算级别高些 ,所以可以写为-(i--),i--为8,加个-号,所以-i--为8,此时i--后,i=7了,然后-i++一样,可以写为-(i++),所以-i++为-7,此时i++后变为8,--i,执行之前减1,所以--i为7,此时i=7,++i相同了,执行i之前加1,所以++i为8,此时i=8,然后计算i--,i--依然等于8,然后i减一变为7,i++,i++等于7,然后i++后,i=8了,所以最后i=8,然后依次打印出来,注意运算的时候是从右向左运算,但打印还是从左至右的打印i,i++,i--,++i,--i,-i++,-i--的值,所以对号结果既出来了.

晕,这种问题有无数人问过无数回了,还有这么多错误回答。
楼上的全是一家之言,不能说错,但绝对不能算正确。

GCC给出了警告很明显:
/main.cpp|6|警告: ‘i’上的运算结果可能是未定义的|

一共给了6个这种警告。
这种在一个语句内多次使用自增和自减表达式的运算结果C语言无定义,换句话说就是各个编译器可以有自己的理解。所以哪个先算哪个后算完全不能确定,纯粹环境相关。
更换编译器或者环境很可能就会导致结果不同。