C语言++与——

来源:百度知道 编辑:UC知道 时间:2024/07/05 00:22:19
#include<stdio.h>
main()
{ int x=0;
int y=1;
int z=x++;
printf("%d,%d,%d\n",x++,y--,z);
}
结果是 1,1,0
为什么X++与Z=X++的输出结果不同 我用的GCC。我觉得X++应该和Z=X++的结果一样啊。
#include<stdio.h>
main()
{ int x=0;
int y=1;
char c='c';
(x++)&&(y--)||((++c)>'c');
printf("%d,%d,%c\n",x,y,c);
}
输出是1,1,d 为什么不是1,0,d

#include<stdio.h>
main()
{ int x=0;
int y=1;
int z=x++;
printf("%d,%d,%d,%d,%d\n",x,x++,x,y--,z);
}
输出是2,1,1,1,0 为什么X出现的先后值不一样
###
在第一个程序里 为什么X++是1而Y--还是1 ,按照X++的理论,Y--应该是0啊

x++“++”后缀时
是先把x的值附给寄存器,寄存器加一,再把值附给x。所以结果x是自增了的
但z=x++;是把寄存器的值附给z,也就是x自增前的值,printf里也一样,是把寄存器的值传进去,而不是自增后的值。

首先 z=x++; //x传给寄存器eax(eax现为0),把eax的值附给z(z=0),x最后是1
printf里x++,是x传给寄存器eax(eax现为1),把eax的值传进去,x最后是2;但输出的是传进去的值1

补充:
你补充的问题跟&&和||运算符有关系
对于&&,如果它的左操作数已经是0了,它就不会再检测右操作数 (也即右操作数的表达式是不会执行的)
对于||,则是如果它的左操作数已经是1了,它就不会再检测右操作数
还有就是“++”和“--”的前缀后缀问题
你自己根据这再想想,应该可以明白

对你再补充的:
我用VC6编译执行的结果是
1,1,1,1,0
而用WinTC的结果则跟你的一样
2,1,1,1,0
对于编译器的方面我不了解,说得不对的请指出:
出现这个原因跟编译器的函数调用机制有关,
两个编译器参数压入堆栈都是从右往左,而TC是先计算完了(即执行了“++”“--”)再压栈的,所以才会有这种结果
而VC是压栈了再执行“++”“--”(这个可以通过反汇编看到,所以还是VC好,有调试工具)

//对于你的补充,我只能感到无语,难道是我表述不清,还是我说的不对,请认真看下我的解释好不

#include<stdio.h>
main()
{ int x=0;
int y=1;
int z=x++;
printf("%d,%d,%d\n",x++,y--,z);
}
结果是 1,1,0

分析:
1: x=0;
2: y=0;
3: z=x=0; x++等价于x=x+1=1