int main(int argc, char* argv[])
{
int a=2,b=2,c;
c=b+(++a)+(++a)+a*(++a);
//c=2+(++a)+(++a)+a*(++a);
printf("c=%d",c);
getchar();
return 0;
}以上的一段代码c的值是  34
但同样把一个常量2代替了变量B,值是一样的。
就是注释里的语句。
为什么输出结果却是  35?
有谁可以解释一下!

解决方案 »

  1.   

    1. c = b+(++a)+(++a)+a*(++a);
    相当于
    c = ((b+(++a))+(++a))+a*(++a); 
    这样按运算顺序是 (b+(++a)) 先中(++a)先运行 就是 (2+3)=5 a=3,
     再是((b+(++a))+(++a))中后边的++a运行 a= 4 就是 5+4 = 9
     就成了9+a*(++a)了,再是++a先运行 a=5就是 9+5*5=342. c = 2+(++a)+(++a)+a*(++a);
    相当于
    c = 2 + (((++a)+(++a)) + a*(++a));
    先是((++a) + (++a))先运行,其中的两个 ++a 优先级相同, 就相当于a先自
    加两再进行和运算,就是 (4+4) = 8, a=4;
    再是(8+a*(++a))就是8+5*5 = 33, 后是 2+33 = 35
      

  2.   

    这个问题很无聊,因为c=b+(++a)+(++a)+a*(++a);
    或者//c=2+(++a)+(++a)+a*(++a);
    都没发预先知道结果的
    原因:b (++a) (++a) a*(++a)都是属于加法层次的变量
    对于同等运算级别的变量,编译器的运算顺序是不固定的
    有的采用从左往右计算,有的采用从右往左计算
    你说,怎么算呢?