首页 新闻 会员 周边

求一运算的结构

0
悬赏园豆:5 [已解决问题] 解决于 2013-09-20 22:48

有    

int a = 0,b = 0;c = 0;

c = (a-=++a),(a+=b,b+=4)

printf("%d %d %d",a,b,c);

求运算的顺序和怎样算?

逗号表达式?

还是一个简单的赋值??

青麦麦的主页 青麦麦 | 初学一级 | 园豆:176
提问于:2013-09-13 19:58
< >
分享
最佳答案
1

单单从贴出的代码, 是确定会报错的, 我想楼主可能是想表达以下意思:

int a = 0, b = 0, c = 0;    //a, b, c 初始化为0

c = (a-=++a), (a+=b, b+=4);    //加个分号

printf("%d %d %d",a , b, c);        //输出a, b, c的值

第一句时, a,b,c都为0这是毫无疑问的;

 

第二句:

1. 首先明确几点:

1>. 逗号的运算顺序是从左向右;

2>. ++的优先级比 += 要高,

3>. = 号的运算顺序是从右向左;

4>. 在这个表达式中, 括号的优先级最高。

那么根据优先级顺序, 先算括号里面的, 第二句有两个括号, 中间有逗号隔开, 根据逗号的运算顺序, 从左向右运算, 应该先算前面一个括号里, 再算后面一个括号里的; 这是一点。

 

在前一个括号中, a-=++a; 根据编译器的贪吃法则, 这个表达式会被理解为 a -= ++a;

根据优先级, 要算++, 那么++a后, a的值就成为了1, 所以前一个括号中的表达式就变成了 a -= a, 也就是 a = a -1; 这样一来, a就又成为了0, 这样前面括号里的表达式的值就成了0, 也就是 c = 0, (a+=b, b+=4);

 

再算后面的那个括号, 同样, 有逗号存在, 先算 a += b, 也就是 a = a+b; 这时 a为0, b也为0, 所以 a+=b依然零, 这样整个表达式就又变成了

c = 0, (0, b += 4);

这时该算 b+=4 了, 同理, b += 4 就等于 b = b +4; b初始时为0, 加上4后b的值就变成了4, 这时整个表达式的就变成了

c = 0, (0, 4);

这时还没有脱去后面的括号, 根据逗号运算法则脱去括号, 整个表达式就成了

c = 0, 4;

这时注意! 逗号的优先级是非常低的, 没有 = 号的高, 所以会把0的值赋值给c, c=0

把这句拆开就相当于

c = 0;

c, 4;

到这就没什么可运算的了, 所以运算结束后, a = 0, b = 4, c = 0;

 

第三句: 输出a, b, c的值,  结果为 0 4 0

收获园豆:5
wid | 菜鸟二级 |园豆:238 | 2013-09-14 17:19

谢谢你的回复啊

青麦麦 | 园豆:176 (初学一级) | 2013-09-14 18:16

洋洋洒洒一大段,可惜完全没看出这个表达式最大的问题。

自己看这个把,(a-=++a)是个未定义行为。

http://www.cnblogs.com/aoaoblogs/archive/2010/05/31/1748103.html

嗷嗷 | 园豆:757 (小虾三级) | 2013-09-18 12:51
其他回答(7)
0

设置断点自己调试啦

秋刀鱼No1 | 园豆:31 (初学一级) | 2013-09-13 22:48
3

写出这种代码的人,一般被打死。

lwkl | 园豆:204 (菜鸟二级) | 2013-09-13 23:20
0

c = (a-=++a),(a+=b,b+=4)这个还没见过,求教育

iEvent | 园豆:529 (小虾三级) | 2013-09-14 11:42
0

这都不报错么?见鬼了

W宁宁 | 园豆:522 (小虾三级) | 2013-09-14 16:11
0

感觉编译都通不过…

0.617 | 园豆:410 (菜鸟二级) | 2013-09-14 17:21
0

这是在玩代码,还是在玩自己?

Albert Fei | 园豆:2102 (老鸟四级) | 2013-09-14 22:53
1
先修改为正确的代码:
    int a = 0,b = 0;
    int c = 0;
    c = (a-=++a),(a+=b,b+=4); 
    printf("%d %d %d",a,b,c);        

接着分析运算。

1、首先定义变量,没什么可说的。

2、对于c对于这句,(,逗号)只是一个分隔符,没什么特殊意义,可以直接用分号替代。

3、c=(a-=++a),从有到做,先是++a,此时a=1;接着a-=a,既a=a-a,此时a=0;然后赋值运算,c=0。

4、(a+=b,b+=4),同2,逗号无意义,可以理解为分号;然后a+=b,此时a=0,接着b+=4,此时b=4。

5、综上:输出为:0,4,0

幻天芒 | 园豆:37175 (高人七级) | 2013-09-15 00:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册