|
发表于 2014-6-20 01:07:37
|
显示全部楼层
目测结果为9,8,8,9,-8,-9,解释以注释形式给出
#include <stdio.h>
void main()
{
int i=8; //i的值为8,不解释
printf("%d\n",++i); //++i表示将整形变量i的值加一,在‘;’的之前那个序列点完成自加操作,因为,i的值为8,所以++i的值为9,此时i的值已经为9
printf("%d\n",--i); //同上,--i表示将整形变量的值减一,在‘;’的之前那个序列点完成自减操作,但是由于i的值9,所以--i的值为8,i的值也已经为8
printf("%d\n",i++); //自增规则同上,不过,序列点的位置由本句的‘;’之前变成了本句的‘;’之后,下一句的’;‘之前,这就是说,当printf函数调用结束的时候,i的值依旧是8,但是当printf函数调用结束后,下一个语句结束前的某个瞬间,i的值变为9,所以结果为8
printf("%d\n",i--); //同上可知,当printf函数调用结束的时候,i的值为9,所以输出的结果为9,到下一个printf语句之前,i的值已经成为8 printf("%d\n",-i++); //上句结束后,i的值为8,可参考第三句,所以的值本句中i++的结果为8,但是i++的前面有取负运算符,所以结果为-8,同上,当语句结束而下语句未结束之前,i的值变为9(i++时,i的值是8)
printf("%d\n",-i--); //因为i的值是9,且由上可知“i--”这一运算在本句结束前不影响i的值,所以对i的值取负,结果为-9,所以全部输出如上
}
下面,我来介绍序列点这个概念:
序列点,指的是相对于编译器系统来说的一个瞬间,在那之前,所以序列点之前(上一个序列点之后)的副作用都应该被实现,(所谓副作用,是指修改变量的值的访问,不改变变量的值的访问被称为透明访问),在本例中,自增/减运算符的作用效果为副作用,所以在相应的序列点之前实现其副作用,然而,本例中的序列点只存在于每个语句的结尾,即’;‘处,所以以’;‘为准,分割各变量的副作用顺序,就可以知道改变时刻语句的执行情况了
满意请采纳,不满意请追问
|
评分
-
查看全部评分
|