怀念部队 发表于 2014-6-20 00:06:52

关于c自加自减的疑惑

#include <stdio.h>
void main()
{
    int i=8;
    printf("%d\n",++i);
    printf("%d\n",--i);
    printf("%d\n",i++);
    printf("%d\n",i--);
    printf("%d\n",-i++);
    printf("%d\n",-i--);
}
这时甲鱼老师的课件练习题,前3个还能理解,从第4个开始就不明白了,求解

折心灬小轩 发表于 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,所以全部输出如上
}

下面,我来介绍序列点这个概念:
序列点,指的是相对于编译器系统来说的一个瞬间,在那之前,所以序列点之前(上一个序列点之后)的副作用都应该被实现,(所谓副作用,是指修改变量的值的访问,不改变变量的值的访问被称为透明访问),在本例中,自增/减运算符的作用效果为副作用,所以在相应的序列点之前实现其副作用,然而,本例中的序列点只存在于每个语句的结尾,即’;‘处,所以以’;‘为准,分割各变量的副作用顺序,就可以知道改变时刻语句的执行情况了

满意请采纳,不满意请追问

怀念部队 发表于 2014-6-20 21:27:53

折心灬小轩 发表于 2014-6-20 01:07 static/image/common/back.gif
目测结果为9,8,8,9,-8,-9,解释以注释形式给出

#include


怎么把币给你啊????

折心灬小轩 发表于 2014-6-20 23:35:41

怀念部队 发表于 2014-6-20 21:27 static/image/common/back.gif
怎么把币给你啊????

如果回答满意,采纳就好了,希望我的回答能帮到你
页: [1]
查看完整版本: 关于c自加自减的疑惑