c形参计算顺序,大家谁看到标准了,我找一个一下竟然没有找到啊
前几天和同学遇到一个小问题,今天整理一下和大家讨论一下,好共同学习。
实际上问题本身很简单,一个很简单的c语言调用
int main()
{
int i=0;
printf("%d,%d",i,i++);
return 0;
}
就是有这么一个函数,然后貌似有某个公司问输出是什么?
好吧如果你很疑惑你可以上VC或者GCC或者G++或者什么上试一下,很抱歉,你的输出可能是1,0.
这个可能就让很多人产生了误解,对了,首先我们要确定一下,在C语言里面这个printf是一个函数
,当然之所以它可以实现有N多个形参,当然是利用相应的技术,这个就不多说了,主要是printf是个
函数,所以,对于"%d,%d",i,i++,这三个数,将分别作为字符串,int类型,和int类型进行传递,
好吧,现在就是,这个为什么会输出的是1,0 ,而不是0,0.
对于函数的形参求值顺序,这个ANSI C他没有规定,而是依赖于编译器的,所以你是先i,在i++还是
,相反,或者你两个一起搞,都可以的。
说到求值顺序就不得不说,在ANSI C中,仅仅规定了,&&和||和?:和“,”的求值顺序,其他的,
你再怎么的都可以,
所以假设有表达式
int j=fun(i,j)+fun1(x,y);
那么函数fun(i,j),fun1(x,y)谁先执行,好吧,只有天知道!所以。这个要是真是某公司的面试题,那么你最好别去了!
大家可以看一本书《C缺陷与陷阱》里面的第三章专门介绍个这个问题。
大家谁看到ANSI C标准中关于这个的说法了,拿出来,看看
[解决办法]
10 The order of evaluation of the function designator, the actual arguments, and
subexpressions within the actual arguments is unspecified, but there is a sequence point
before the actual call.
c99 72页