有
int a = 0,b = 0;c = 0;
c = (a-=++a),(a+=b,b+=4)
printf("%d %d %d",a,b,c);
求运算的顺序和怎样算?
逗号表达式?
还是一个简单的赋值??
单单从贴出的代码, 是确定会报错的, 我想楼主可能是想表达以下意思:
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
谢谢你的回复啊
洋洋洒洒一大段,可惜完全没看出这个表达式最大的问题。
自己看这个把,(a-=++a)是个未定义行为。
http://www.cnblogs.com/aoaoblogs/archive/2010/05/31/1748103.html
设置断点自己调试啦
写出这种代码的人,一般被打死。
c = (a-=++a),(a+=b,b+=4)这个还没见过,求教育
这都不报错么?见鬼了
感觉编译都通不过…
这是在玩代码,还是在玩自己?
先修改为正确的代码: 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