首先,printf函数是从右到左的计算输出表达式表,但输出的时候是按照输出格式字符的顺序输出,比如int x=1;printf("%d,%d",x,x-=1);输出结果是0,0;而不是0,1;而楼主程序中的2个printf是顺序结构,所以输出前的赋值计算顺序是第一行后一个x→第一行前一个x→第二行后一个x→第二行前一个x(也就是从右往左,从上往下的计算),但输出的时候是从左往右,从上往下计算。
OK,let's start!
先算第一行后一个x的值,就是把32769以%d的格式赋给x,因为32769超过了%d格式的数值范围,而32769对应两字节的二进制是1000 0000 0000 0001,而%d最多表示0111 1111 1111 1111,so,32769被计算机理解为1000 0000 0000 0001 ,最高位被理解为符号,1代表负号,然后计算机就以1000 0000 0000 0001为原码求反码求补码得出1111 1111 1111 1111。转换为十进制就-32767。
再算第一行第一个x的值,格式允许,直接得出32769。
然后计算第二行后一个x,此时要注意了,因为long是4字节,32769是0000 0000 0000 0000 1000 0000 0000 0001,我们之前用了后16位的数据,而前面的还有16个0去哪了呢?这就是3楼说的“流”的问题咯,流向了此时要计算的第二行后一个x的计算中了,第二行的后一个x变成了1000 0000 0000 0001 0000 0000 0000 0000计算发现,1000 0000 0000 0001 0000 0000 0000 0000的值又超出了long的数值范围,所以按照算第一个的思想算出了-2147418112。
哈哈,终于算完了,我自己懂了,and you?
这是我基于所学的知识的理解,如果有错,请看出来的高手一定要告诉我啊。thanks!
[
本帖最后由 pgy 于 2009-9-23 23:47 编辑 ]