为什么VC和TC输出来的值不同???

来源:百度知道 编辑:UC知道 时间:2024/05/22 03:10:52
#include "stdio.h"
void main()
{int a=5,b=6,c;
printf("%d\n",c=++a+b,b++);
printf("%d\n",c=++a+b,++b);}

VC输出的值是12和15
TC输也的值是13和15
为什么会这样?
那下面这个怎么解释:
#include "stdio.h"
main()
{
int x=2,y;
y=(++x)+(x++)+(x--);
printf("%d%d\n",x,y);
y=(++x)+(x++)+(++x);
printf("%d%d\n",x,y);
x=3;
y=(x++)+(x++)+(++x);
printf("%d%d\n",x,y);
getch();}

VC输出9 13 10
TC输出9 15 12

个人认为是这样的:

VC从左向右执行代码,遇到++或--在前时做增值处理,++或--在后则不做增值
printf("%d",x)的话就会重新计算X的值,++或--在前和++或--在后都会做增值处理

TC则先找++在前的先处理增值,然后再把增值后X的值进行运算,++或--在后不进行增值处理,如遇逗号则++或--在后的处理也会进行处理,printf("%d",x)的话就会重新计算X的值,++或--在前和++或--在后都会做增值处理

这是编译过程中的“优化”副作用造成的。
不优化得12和15,优化得13和15。

如果VC编译选优化2 (默认是不优化):
CL /O2 程序名.C
执行结果也变成13和15。

[编译中选优化会带来副作用。尽管 /O2 优化能使可执行程序获得最快速度“maximize speed“]
---------------------------------------

我没有TC,,请试试优化和不优化。

linux 下 cc -o0 ...; cc -o1 ...; cc -o2 ...执行结果13和15

看来不要写这种有二义性的语句为好,不同编译结果不同。

printf函数的参数装载顺序不同

VC扫描参数时从左向右,先执行c=++a+b后执行b++
而TC采用传统的方法,即装载参数时从右向左,先执行了b++所以多了1。

----------------------------
顺便跟楼上的说一句
操作符的优先级和结合顺序是作为C/C++语言标准确定的,++的优先级高于+且+的结合顺序为从左到右这是规定,不管什么编译器,都必须将c=++A+B翻译为 C = (++A) + B 如果如你所说解释为
c=++(a+b)则该编译器根本不符合C或C++基本规范,TC没这么差吧?

-------------------------
看来还得修改一次答案
在跟本来是楼下现在是楼上的这位探讨一下

源码中语句为
printf("%d\n",c=++a+b,b++);
printf("%d\n",c=++a+b,++b);
两次输出的都是c
两个c的计算表达式完全一样都是++a在前而您解释了半天VC和TC处理a++的不同,姑且不论正确与否都不影响其处理++a的方式吧?按照C标准必然是令a自增返回值并覆盖原a值吧?怎么会导致不同的结果呢?只能说明VC和TC执行c=++a+b和b++的