怎么算?a++是独立出来的吗?为啥a的值最后变化了?

来源:3-4 练习题

正在进化的程序猿

2015-06-18 09:20

a+b%a-b/a+a*b-a++

写回答 关注

2回答

  • onemoo
    2015-06-18 18:11:44
    已采纳

    先确定你清楚“运算符”、“表达式”和“语句” 的关系:

    ++ 是一个“自增运算符”,运算符和操作数合起来就是一个表达式(a++、++a都是表达式,a就是操作数)。每一个表达式都有值(和其类型)。有的运算符还有“副作用”,比如自增运算符的副作用就是使其操作数自增1。那么自增运算表达式的值是什么呢? a++ 的值就是 a 的值,而 ++a 的值等于 a+1。

    表达式后面加上一个分号就是一个“语句”。

    那么这个自增运算符的副作用(使a增加1)什么时候发生的呢? 我只能说在“序列点”之后肯定都发生了。代码中有的位置被称为“序列点”,具体哪些位置是序列点有些复杂,简单地说:“语句结束时”和“逻辑运算符的两个操作数之间”......都算是序列点。这序列点之前的运算符的副作用,在执行到这点以后都保证会发生。注意并不是在这一点之后就突然发生的,这些副作用可能在序列点前的任何一个位置发生,C标准只是规定在序列点之后这些副作用必须都已经发生了。

    求值顺序决定了哪些子表达式先运算,但是并没有规定它们操作数的求值顺序。副作用什么时候发生更是与优先级没有关系。


    对于你的这个题:

    题本身就有问题!!  原因还是因为序列点。在a+b%a-b/a+a*b-a++这个大复合表达式中,最后有一个a++,这个子表达式的值是3没有错(因为是先求值再自增),但在整个表达式中a还出现了很多次,就是说需要取a的值很多次,可是最后这个子表达式a++的副作用在什么时候发生是并不确定的。我只知道在整个语句结束之后a的值肯定是4,但a也可能在取第一个a的值时就已经是4了......也可能第一个a还是3,第二个a就是4了......也可能所有的a都是3......这一切都是有可能的。所以本题完全就错了!!


    P.S. 这个C课程的水平实在是......别浪费时间学了

    onemoo 回复正在进化的程...

    http://mooc.guokr.com/topic/programmers/ 另外推荐《C primer plus》

    2015-07-07 16:56:54

    共 3 条回复 >

  • 康振宁
    2015-06-18 10:13:29

    http://www.imooc.com/code/5175  看看这节的运算符顺序 

C语言入门

C语言入门视频教程,带你进入编程世界的必修课-C语言

926025 学习 · 20793 问题

查看课程

相似问题