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?
有谁可以解释一下!
{
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?
有谁可以解释一下!
相当于
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
或者//c=2+(++a)+(++a)+a*(++a);
都没发预先知道结果的
原因:b (++a) (++a) a*(++a)都是属于加法层次的变量
对于同等运算级别的变量,编译器的运算顺序是不固定的
有的采用从左往右计算,有的采用从右往左计算
你说,怎么算呢?