棘手的C问题,谢绝链接

来源:百度知道 编辑:UC知道 时间:2024/06/17 18:30:33
#include<stdio.h>

void main()
{
int a,b;
a=5;
b=(++a)+(++a)+(++a);
printf("%d %d\n",a,b);
}
VC 运行结果是22
TC 运行结果是24
程序修改后
#include<stdio.h>

void main()
{
int a,b=0;
a=5;
b=(b=(++a))+(++a)+(++a);
printf("%d %d\n",a,b);
}
VC 运行结果是21
再次修改为
#include<stdio.h>

void main()
{
int a,b;
a=5;
b=(++a);
b+=(++a);
b+=(++a);
printf("%d %d\n",a,b);
}
VC 运行结果是21
请问这三个程序间有何区别?
为什么结果会不一样?
为什么第一个程序在TC和VC下结果不同?

我没有TC, 不能试验。
估计问题出在编译过程的优化上。

你试试让编译器不作优化。VC 默认 不作优化。
[ /Od disable optimizations (default)]

优化时常会带来问题。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

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

VC优化 /O1 或 优化 /O2 得结果 24 -- 与 TC 同。
VC不优化 得结果 22

三程序不同是扫描顺序引起的。++a 这种东西(前加加后加加之类)少用为妙,初学者搞不清它的变化发生在表达式执行之前还是表达式执行之后。3程序不同就是这么造成的。

编译器的问题,按道理应该是21
不同的编译器,不同的优化方案,结果不同
最好在同一行程序里不要对一个变量++
太险了,出了问题不好查

赋值运算符和++,--运算符具有副作用,所以表达式的计算顺序就会导致表达式的计算结果的不同.
所以这里再TC和VC下运行结果的不同,就应该是表达式的计算顺序导致的.
即从左到右或者是从右到左.

出这样题目的老师都TMD的是误人。C标准并未对这样的表达定义先后的顺序,所以编译器厂商可以根据自己的理解进行计算,所以运行结果因编译器不同而不同。

我记得谭浩强好像是最喜欢出这样的题,当时还挺崇拜他的,现在想想估计他当时就用TC运行一下,得到一个结果,就认为应该如此,现在想想真混蛋。

这样的代码在项目中应该明令禁止,如果实在无法避免,应该使用括号套括号的定义好计算顺序。