下面这段c源程序在VC++和turboc2的结果不一样,为什么??

来源:百度知道 编辑:UC知道 时间:2024/06/08 16:15:39
main()
{
int a=2,*p=&a,*q=&a;
printf("%d%d\n",*p++,*(q++));
p=&a;q=&a;
printf("%d%d\n",*p,(*q)++);
getch();
}
在VC++中的结果是
22
22

在turboc2的结果是
22
32

请给出详细的解说…谢谢

++比*的优先级高而且是最后运算,所以第一个输出结果是一样的。相当于取出*p和*q以后对指针进行++
第二个()的优先级最高,所以先取出q指针指向的整形值2,再让这个整形值增一,再取出值。

VC和TC不同的是求值顺序问题
TC默认从右向左求值,VC则相反
TurboC有这样一个关键字:pascal,参数压栈顺序是第一个参数最先压栈
例如:
far pascal HisFunc(int x, char *s);
也就是先算第一个参数,然后算第二个参数

相反有这样一个关键字cdecl
参数压栈顺序是:最后一个先压栈,也就是先算最后一个
例如
far cdecl HisFunc(int x);

对于++和--运算符,标准并不保证它们的副作用被正确实施----这取决于编译器的具体实现。

比如对于如下代码:
int i=3;
i=i++;
不同编译器给出不同的结果, 有的为3, 有的为4, 哪个是正确的?
事实上没有正确答案;这个表达式无定义。同时注意,i++ 和++i 都不同于i+1。如果你要使i 自增1, 使用i=i+1, i+=1, i++ 或++i,而不是任何组合。

又如下面的问题:
使用我的编译器,下面的代码int i=7; printf("%d\n", i++ *i++); 返回49?不管按什么顺序计算, 难道不该打印出56吗?

尽管后缀自加和后缀自减操作符++ 和-- 在输出其旧值之后才会执行运算,但这里的“之后”常常被误解。没有任何保证确保自增或自减会在输出变量原值之后和对表达式的其它部分进行计算之前立即进行。也不能保证变量的更新会在表达式“完成” (按照ANSI C 的术语, 在下一个“序列点” 之前, 参见问题3.7) 之前的某个时刻进行。本例中, 编译器选择使用变量的旧值相乘以后再对二者进行自增运算。
包含多个不确定的副作用的代码的行为总是被认为未定义。(简单而言, “多个不确定副作用” 是指在同一个表达式中使用导致同一对象修改两