为了账号安全,请及时绑定邮箱和手机立即绑定

a++怎么还是3???

a++怎么还是3???

正在回答

4 回答

我不得不再说一遍:这个题是错的!

你先要明白前置自增运算符和后置自增运算符是怎么回事:

通常说,a++是先取值后运算,++a是先运算后取值。实际上这里涉及“运算符”、“表达式”和“语句”的概念。

++ 是一个“自增运算符”,自增运算符有两种形式:前置自增(++a)和后置自增(a++)。

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

表达式后面加上一个分号才是一个完整的“语句”。

还有一个关键内容:前面说使操作数自增1是自增表达式的副作用,那么这个副作用什么时候发生呢? 准确地说是在“序列点”后保证会发生。 序列点这个概念比较复杂,简单地说:“语句结束时”是一个序列点。这序列点之前的运算符的副作用,在执行到这点以后都保证会发生。注意并不是在这一点之后就突然发生的,这些副作用可能在序列点前的任何一个位置发生,C标准只是规定在序列点之后这些副作用必须已经发生了。

复合表达式中的运算顺序是由运算符优先级决定的,但参与运算的操作数的求值顺序是未定的。

在a+b%a-b/a+a*b-a++这个大复合表达式中,根据运算符优先级,a++先算,这个子表达式的值是3没有错(因为是先求值再自增),但a++的副作用在什么时候发生是并不确定的,且其他的a是什么时候取值也是不确定的。我只知道在整个语句结束之后a的值肯定是4,但a也可能在取第一个a的值时就已经是4了......也可能第一个a还是3,第二个a就是4了......也可能所有的a都是3......这一切都是有可能的,所以这段代码的行为就是未定义的。


对于写复合表达式,一般建议:如果表达式改变了一个操作数的值,那就不要在这个复合表达式中再次使用这个操作数。除非你能确定“改变值”和“使用值”的先后顺序。 在这个例子中,显然你不能确定顺序。


0 回复 有任何疑惑可以回复我~

根据优先级顺序,先计算a++,a++命令先算前面的,最后再加一。所以a++结果为3,然后根据优先级顺序,先计算b%a=1,b/a=1(整数计算结果只能是整数),a*b=3*4=12,总算式答案为3+1-1+12-3=12,最后在输出之前,a加一,故a输出为4,答案输出为12.

1 回复 有任何疑惑可以回复我~

a++的意思是,把先a带入算式,等到算完所有的之后——,然后再把a拿过来加加,这种类型的题目是初学c语言的易错点和难点。

1 回复 有任何疑惑可以回复我~
#1

残月沉霜

a带入算式后,是从哪里变为了2的?
2015-03-05 回复 有任何疑惑可以回复我~
#2

Q_千年老妖 回复 残月沉霜

根据优先级顺序,先计算a++,a++命令先算前面的,最后再加一。所以a++结果为3,然后根据优先级顺序,先计算b%a=1,b/a=1(整数计算结果只能是整数),a*b=3*4=12,总算式答案为3+1-1+12-3=12,最后在输出之前,a加一,故a输出为4,答案输出为12.
2015-03-05 回复 有任何疑惑可以回复我~
#3

残月沉霜 回复 Q_千年老妖

谢谢了哈
2015-03-07 回复 有任何疑惑可以回复我~

a++ 是先取值再计算,++a 是先计算再取值

1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
C语言入门
  • 参与学习       926207    人
  • 解答问题       20797    个

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

进入课程

a++怎么还是3???

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信