帽峰山一日游路线图:关于C语言中连续用++计算得出结果的变化!

来源:百度文库 编辑:查人人中国名人网 时间:2024/05/04 17:46:19
#include <stdio.h>

void main(void)
{
// int a=10,b=10;
// printf("%d\t",a+=a-=a*a);
// printf("%d\n",b+=b-=b*=b);
int a1,a2,a3,a4,b1,b2,b3,b4;
a1=a2=a3=a4=10;
b1=(++a1)+(++a1)+(++a1);
b2=((++a2)+(++a2))+(++a2);
b3=(++a3)+((++a3)+(++a3));
b4=(++a4)+(++a4);
b4+=++a4;
// b2=(++a2)+(++a2);
//// int b2;
//// b1=++a1;
//// b2=b1+(++a1);
//// b1=b2+(++a1);
// b1=b1+b2;
// b2=++a1;
// b1=b1+b2;

// b1=(a1++)+(a1++)+(a1++);
printf("b1=%d\t b2=%d\tb3=%d\tb4=%d\ta1=%d\n",b1,b2,b3,b4,a1);
}
b1=(++a1)+(++a1)+(++a1);
为什么等于37,而不是36
下面问题也如此
我用的编译器是
Microsoft Visual C++ 6.0

"a++"这个式子是a加1之前的值,"++a"是a加1之后的值.
如a=0;i=0;
i=a++;//执行之后a=1,i=0;
a=0;i=0;
i=++a;//执行后,i=1;a=1;

那你的程序:
这里又有个算法就是加法:
a1=a2=a3=a4=a5=10;
b1=(++a1)+(++a1)+(++a1); //12+12+13=37
b2=((++a2)+(++a2))+(++a2); //(12+12)+13=37
b3=(++a3)+((++a3)+(++a3)); //13+(13+13)=39
b4=(++a4)+(++a4); (12+12)=24
b4+=++a4;//24+13=37
再加一个b5=((++a5)+(++a5))+((++a5)+(++a5));//(12+12)+(14+14);
不知道你找到编译器的计算规律了吗???它是在括号内计算结果,和在最左(就是最后要计算综合的那个+的两边时)才计算每一个式子的值..

编译器不同结果也不同,不知道现在怎么都喜欢研究这些问题。考级也喜欢搞这种乏味的练习,运算符优先级和结合性学习之后,应当努力使自己写出易于维护的,日后自己和别人都能看得懂的程序,这样的程序风格应该摒弃。搞一些咬文嚼字的事情,完全是取其糟粕,丢其精华。有着个闲功夫,应该看看C语言的指针,结构,动态内存分配销毁等重要问题,把数据结构好好读读。
若想学编程,以上是我的一点点建议。若是纯粹应试,就当我什么也没说。~~

我想对楼主说的是这样的编程习惯是不好的。因为标准C没有规定类似于b1=(++a1)+(++a1)+(++a1);的表达式应该以什么样的顺序进行计算,也就是说没有规定这种情况下a1该取哪个时刻的值。不同的编译器会有不同的结果,我的结果是39 39 39 37 13(Turbor C2.0)。也就是说TC先计算完整个表达式的a1的值再取a1的值。所以b1=13+13+13=39.b4=12+12=24;b4=b4+13=24+13=37.b1,b2,b3,b4也可能等于36(有些编译器会有这样的结果).楼主用的什么编译器?