精索静脉曲张怎么缓解:为什么VC和TC输出来的值不同???

来源:百度文库 编辑:高考问答 时间:2024/05/04 17:03:16
#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++的顺序不同吧?

而后面的b++和++b根本没有输出,在单独成句的时候,无论那种解释方式编译结果都只是令b自增1而已

问题提的不错,而前两位的回答都是错误的,所以值得我给你多写点。
其实是这样的
1. vc和tc的输出表达式里运行的顺序都是右到左
2. vc在遇到输出表达式里有a++这样的语句时是这么处理的
--输出a
--等输出表达式结束在执行a=a+1;
而tc则是在输出表达式先按照右到左的顺序执行当碰到a++的时候先做a=a+1然后再继续按照右到左的顺序执行
为了说明这个东西我给你设计了一些代码方便你理解
说明第一点的代码:
tc代码如下:
#include <stdio.h>
void main()
{
int b = 2;
printf("%d %d %d\n",b=b+1,b=b+1,b=b+1);
getch();
}
结果为:
5 4 3
vc代码如下:
#include <stdio.h>
void main()
{
int b = 2;
printf("%d %d %d\n",b=b+1,b=b+1,b=b+1);
}
结果为:
5 4 3
这样就看出结合性了 都是右到左

说明第二点的代码:
tc代码:
#include <stdio.h>
void main()
{
int b = 2;
printf("%d %d %d\n",b,b++,b);
printf("%d\n",b);
getch();
}
结果:
3 2 2
3
vc代码:
#include <stdio.h>
void main()
{
int b = 2;
printf("%d %d %d\n",b,b++,b);
printf("%d\n",b);
}
结果:
2 2 2
3
这里看出最后在输出语句结束后都的到了b=b+1的结果第2个输出语句的结果3
但是第一个输出语句的结果说明tc在输出语句里就执行了b++,而vc则没有在输出语句里执行b++,其实他隐含着在这个输出语句后还有一个b=b+1;是你看不到的。
你还可以在vc里用
#include <stdio.h>
void main()
{
int b = 2;
printf("%d %d %d\n",b++,b++,b++);
printf("%d\n",b);
}
来看看结果是不是
2 2 2
5
如果你能理解到
#include <stdio.h>
void main()
{
int b = 2;
printf("%d %d %d\n",b,b,b);
b++;
b++;
b++;
printf("%d\n",b);
}
这样的代码时,就说明你已经明白了。
到这 你完全可以自己解释你提出的问题了
这里提醒一下,tc vc在输出语句里碰到++a这样的语句时,都是在输出语句里直接解决的。
我的邮箱gabmyd@126.com
如果还有疑问可以来信
--------------------------------------------------------
答复: 0fanim

有人说我写的多 那我就不写那么多了
明白的告所以你tc vc在printf中碰到x++时的情况
tc
执行 显示b(如果有对应的现实符);b=b+1 (如果一个printf里有多个b++那么循环执行上面的过程)
vc
执行 显示b(如果有对应的现实符)(如果有多个b++ 也是只显示原来的b);当printf结束时执行记录下来个数的b++;也就是不管有多少个b++都在在执行printf当中只显示原来的b,当printf结束后运行对应个数的b=b+1;

tc vc printf的执行顺序都是右到左
说明这个问题的设计如下:
#include <stdio.h>
void main()
{
int b = 1;
printf("%d %d\n",b++,b++);
printf("%d\n",b);
printf("%d %d %d %d\n",b++,b++,b=50,b++);
printf("%d\n",b);
}
tc结果
2 1
3
51 50 50 3
52
vc结果
1 1
3
50 50 50 3
53

多了我不在说了 鄙视那些自己不思考 想当然的人

0fanim 同学。。。。
如果你还不服 我在好好给你讲讲 按照你的说法是
tc 先做x++ 的等式 然后再作 ++a的等式
vc 先做++x 的等式 然后再作 x++的等式
并且等式在输出语句内就得到结果然后输出 。。
那么你用这个语句在tc vc下做做 看看你的说法能成立不
int a=5,b=6;
printf("%d\n",b++,b=++a+b);
tc下 先做b++ b=7 然后做b=++a+b a=6 b=13 然后输出b 13
vc下 先做b=++a+b a=6 b=6+6=12 然后做b++(根据你说的b++要在输出语句里完成)所以b=13 然后输出b 13
你把这段代码分别那到tc vc环境下试下 结果一定都是12 因为你理解错了
按照我的说法你在看看
根据右到左的计算方向
tc b=6+6=12 (碰到b++ 并且有对应的显示)显示b (12) b++
如果你在printf("%d\n",b++,b=++a+b);后在加个printf("%d\n",b);
你就会看到printf("%d\n",b++,b=++a+b);里最后的b++;的结果了 13

vc b=6+6=12 (碰到b++ 并且有对应的显示)显示b (12) printf结束后b=b+1;
如果你在printf("%d\n",b++,b=++a+b);后在加个printf("%d\n",b);
你就会看到printf("%d\n",b++,b=++a+b);后执行的b++;的结果了 13

你也可以用printf("%d %d\n",b++,b++,b=++a+b);这会看的更清楚
右到左计算
tc b=12 显示12 执行b=b+1=13 显示13 执行b=b+1=14 显示结果
13 12 在后面再输出一个b 结果就应该是14

vc b=12 显示12 记录b++次数为1 显示12 记录b++次数为2 显示结果
12 12
在执行2次b=b+1; b=14 在后面再输出一个b 结果就应该是14

++x 在vc tc 中都一样 在printf中就解决 先x=x+1 在显示x(如果有对应的现实位)

可以用
#include <stdio.h>
void main()
{
int b = 1;
printf("%d %d\n",++b,++b);
printf("%d\n",b);
printf("%d %d %d %d\n",++b,++b,b=50,++b);
printf("%d\n",b);
}
在tc vc中测试 结果都应该一样
3 2
3
52 51 50 4
52

在提示一下 因为库函数原型我们看不到 所以遇到这样的问题 只有通过上面这样的逻辑推理来推想库函数的执行过程 tc vc 编译器的稍微不同就得到不同结果,提示大家 写程序一定要规范 这样的语法结构型不应该出现在开发代码中,如果你是程序员,你会非常危险的弄不好,就为了这段代码你的工作就没了......现在在搞开发的朋友一定深有体会...
在学习中能够想到这么去比较编译器,还是不错的值得鼓励.但不要把时间都浪费在这上,祝愿大家进步!
碰到问题要用代码去说明 不要凭空想象,这样做很危险!
这里我做的解释,是一个合理的推论,实际的源码我们看不到,所以可能跟真实的代码思路还是有些出入,希望大家来指正,但要带代码来说服我!!

一不小心 又写了这么多。。。。。。大家眼睛受累了。。。!

所以说,实际工作中请不要写这样的代码。

0fanim - 见习魔法师 二级 正解
c/c++语言规范中都没有定义函数参数的计算顺序,按照如何的顺序计算完全由编译器决定。所以这种代码可移植性很差,应该尽量避免。

我也说两句:
我是在linux下测试的,用gcc和c++、g++ 三种编译器编译 ,得到的 结果是一样的 !都是13,15........
后来 ,我就看了一下 其他的结果发现如下:
程序如下:
#include <stdio.h>

int main()
{
int a=5,b=6,c,d=2;
printf("%d\n",c=++a+b,b++);
printf("%d\n",c=++a+b,++b);
printf("%d %d %d %d \n",d,++d,++d,++d);
d=2;
printf("%d %d %d %d \n",d,d++,++d,++d);
d=2;
printf("%d %d %d %d \n",d,++d,d++,++d);
d=2;
printf("%d %d %d %d \n",d,++d,++d,d++);
d=2;
printf("%d %d %d %d \n",d,d++,d++,++d);
d=2;
printf("%d %d %d %d \n",d,++d,d++,d++);
d=2;
printf("%d %d %d %d \n",d,d++,++d,d++);
d=2;
printf("%d %d %d %d \n",d,d++,d++,d++);
return 0;

}
三次编译结果:
g++ -o ..........
/*
13
15
5 5 5 5
5 4 5 5
5 5 3 5
5 5 5 2
5 4 3 5
5 5 3 2
5 4 5 2
5 4 3 2
*/
c++ -o ........
/*
13
15
5 5 5 5
5 4 5 5
5 5 3 5
5 5 5 2
5 4 3 5
5 5 3 2
5 4 5 2
5 4 3 2
*/
gcc -o ........
/*
13
15
5 5 5 5
5 4 5 5
5 5 3 5
5 5 5 2
5 4 3 5
5 5 3 2
5 4 5 2
5 4 3 2
*/
相信 大家可以看出什么!