vc中的问题

来源:百度知道 编辑:UC知道 时间:2024/05/23 20:28:07
main()
{ int a=3,b=5,c=15,d=2;
printf("%d\n",6-a*b/c%d);
printf("%d\n",++a-++a);
}

由于++优先于–,因此先进行第一个++a的运算,得a=4作为被减数,再进行第二个++a运算,得a=5作为减数,最后进行“–”运算,结果为–1
但是在vc中进行调试时得到的结果为0,printf("%d\n",(++a)-(++a));结果依然为0 矛盾!!!!!

#include <stdio.h>
void main()
{
int c=5;
printf("%d,%d,%d\n",c+=c++,c+8,++c);
c=5;
printf("%d\n",(c+=c++,c+8,++c));
printf("%d\n",c);
c=5;
printf("%d\n",c+=c++,c+8,++c);
printf("%d\n",c);
c=5;
printf("%d\n",c+=(c++));
printf("%d",c);
}

程序中第一个printf()中的3个格式转换说明符对应3个输出项。执行时,根据Turbo C的规定(当printf()函数中出现多个表达式输出项时,先按从右到左的顺序计算各表达式的值,然后再显示结果,而不是从左到右计算,也不是每计算一个表达式就输出结果),先计算最右边的++c,得c=6;然后计算c+8,得14;最后计算c+=c++。此时,先取出c的值6,然后将它的值加1,使c的值变成7,c+=c++表示的是c=c+c++,即c=7+6=13。第二个printf()中只有1个格式转换

前两个问题没意义, c和c++标准规定, 在两个序列点之间(基本可以认为就是一个语句里)一个变量只能被赋值一次。 所以 ++a + ++a 之类的东西都是不行的, 如果你非要写这样的东西,怎么算由编译器决定, 他给你个什么结果都正常

第三个问题, 如果你知道为什么第一次产生那样的结果,就知道怎么解释后面的结果了。 字符串是到0结束的, 第一次你把数组都写满了, 中间没有0,所以就一直输出下来。 第二次你每写满,中间有了0所以就结束了

其实你所出现的问题,就c++中的二义性,就对你的第一个问题分析哈!++a-++a
如果从左往右算就是1,但有的编译器是从右往左算就是0了,这就是c++中的二义性,一般编程人员都不会写这中可能出现二义性的程序的,在写程序时就要避免这个问题,你可以写成(++a)-(++a),也就结果是0还是1是由你的c++的编译器决定的

这个是很基础的东西,个人建议你多看一下书里的讲解!