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

这个自增运算实在搞不懂了,,,

#include <stdio.h>
int main()
{
    int m,n,i=15,j=20;
	m=(i++)+(i++)+(i++);n=(--j)+(--j)+(--j);
	printf("i=%d,j=%d,m=%d,n=%d\n",i,j,m,n);
    return 0;
}

为啥m直为45而不是15+16+17=48,n值为53不是19+18+17=54、、

正在回答

6 回答

这算是化石级的经典错误了...

第5行,这个两个关于i和j表达式的行为是未定义的,不同编译器也许会得出不同的结果。别去分析为什么会得出这个值或是那个值了,这种写法根本就是个错误!

详细的原因请看这里我的回答 http://www.imooc.com/qadetail/87888

注意那个“序列点”的概念,你这个表达式的问题和我在那个帖子中解释的一样:在求m和n的这两个语句中,你无法确定 i 和 j 都是什么值。

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

Backkom 提问者

非常感谢!
2015-10-21 回复 有任何疑惑可以回复我~

但是这个好像跟编译器有关系,有的时候可能不太一样,这个我忘了。。。。

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

Backkom 提问者

VC6.0,,,
2015-10-20 回复 有任何疑惑可以回复我~
#2

Jaydon_ 回复 Backkom 提问者

那你就按照我给你讲的方法呀,嘿嘿,给个最佳回答>
2015-10-21 回复 有任何疑惑可以回复我~

嘿嘿,小兄弟,我告诉你一个方法,希望可以帮助你理解。


 int m,n,i=15,j=20;

    m=(i++)+(i++)+(i++);n=(--j)+(--j)+(--j);

这边i++相当于这样

m=i+i+i; 15+15+15

i++;

i++;

i++;

而--j是相反的在表达式前面执行相当于这样

--j; j=19

--j; j=18 

--j; j=17

n=17+17+17;


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

Jaydon_

我觉得,我写的比最佳回答好!!!!!
2015-11-05 回复 有任何疑惑可以回复我~

所以,你最后求到的, i=16 , j =17

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

Backkom 提问者

程序运行结果i=18,j=17、、、、
2015-10-20 回复 有任何疑惑可以回复我~

表达式执行完毕后 “a” 的值都自减少1。

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

menghuanbaolei

或者自增长
2015-10-20 回复 有任何疑惑可以回复我~

m = 15 + 15 + 15;

n = 19 + 17 + 16;

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

举报

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

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

进入课程

这个自增运算实在搞不懂了,,,

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