求一个C的运行结果 int a[]={1,3,5,7,9},*p=a; printf("%d,%d",(*(++p)++),*p++}; printf("%d",a[2]);
printf("%d,%d",(*(++p)++),*p++}; printf("%d",a[2]);
结果是3,1,5
还是5,1,6??
望大神帮一下忙!!! 展开
第一句输出错了个大括号,结果是 3,3 5
如果改为如下:
int a[]={1,3,5,7,9},*p=a; printf("%d,%d",(*(++p)++),(*p)++); printf("%d",a[2]);
结果就是 3,3 6.
不明白可以问。
谢谢回答~~~
还想问一下是(*(++p)++)和*p++同时执行么???还是从左至右或从右至左???
第二个3是怎么得到的???
实测了一下(Visual Studio 2012),结果是5,3,5。
int a[]={1,3,5,7,9},*p=a;
printf("%d,%d,",(*(++p)++),*p++); printf("%d",a[2]);
好像C/C++标准没有规定printf的参数入栈顺序吧,这样的话编译器不同就可能不同。
哦~
书上没有写printf从左至右、从右至左还是平行输出。但是我在一个参考书上看到从右至左。
应该是编译器的问题吧。谢谢啦!!!
首先这个程序必须用C++编译器来编译,不能用C编译,因为C里++p没有左值,不能(++p)++。
楼主分析得对,大部分编译器实现都是从右往左传。
Dev-Cpp编译main.cpp以下内容,结果是5,1,5,这样就好解释了吧。首先p++的值是&a[0](*p++==1),执行完后p==&a[1];然后++p的值是&a[2],执行完后p==&a[2];最后(++p)++的值是&a[2](*(++p)++==5),执行完后p==&a[3]。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[]={1,3,5,7,9},*p=a;
printf("%d,%d,",(*(++p)++),*p++);
printf("%d",a[2]);
system("pause");
return 0;
}
Dev-Cpp用GNU的内核,比较贴近C/C++标准的。
Visual Studio 2012也是从右往左传的,但它并不是先算出最右边的参数,再开始计算第二个参数,而是两个参数穿插着算的。因此在printf等函数调用中使用有副作用的表达式要小心。
楼主提到“理论上是5,1,6",是没有注意到*(++p)++的运算顺序是p、++p、(++p)++、*(++p)++,那个后置++是作用在(++p)上的,不是作用在*(++p)上的。
恩恩。。。太大意了。嘿嘿
在计算机中,无论什么表达式都不可能同时执行。在printf("%d,%d,",(*(++p)++),*p++);中,变量列表是从右至左执行的,即先执行*p++将结果压栈,再执行(*(++p)++),再将结果压栈。这里要注意的是p是指向数组的指针,数组是按下标操作的,所以像计算*p++时并不是将a[0]=1这个值1压入栈而是只压入指针变量p(这时p=a);然后计算(*(++p)++),它的++p使p指向了a[1]=3,同样压入的是p(这时p=a+1)。从左至右弹出来时先取p=a+1的值a[1]=3并输出,按控制符再输出一个逗号,紧接着弹出先压入的p——这里有一点要理解一下——压入的是指针变量p ,它原来等于a,而现在p被++p操作成等于a+1了,所以取出的数值也是a[1]=3。最后由printf("%d",a[2]);接着输出a[2]=5,所以最后的结果是3,35。且,这还与编译器有关,一些编译器在细节上可能不这样处理……
什么运行结果自己不可以试一下吗?
再说不同的编译器,运行结果也可以不相同。
如果你来做编译器,你会怎么处理?
我试过了,用vc6.0试出来是3,1,5
但是理论分析应该是5,1,6
所以才想问问
广告 您可能关注的内容 |