请教个关于函数参数的问题?
看《程序设计实践》第七页上有个例子,scanf( "%d %d ",&yr,&profit[yr]);书上说:“scanf的所有参数都在函数被真正调用之前就已经求好值了,所以这里&profit[yr]实际上使用的总是yr原来的值。”这里基本上可以理解。
然后有个习题:
指出下面程序的错误:
int read (int *ip)
{
scanf( "%d ",ip);
return *ip;
}
……
insert(&graph[vert], read[&val], read(&ch));
我的疑问是:
1:如果把insert(&graph[vert], read[&val], read(&ch));改为insert(&graph[vert], read[&val]);程序能否成功。
2:对于函数实参的计算是有序的吗?也就是对于上面的程序是否是先计算&graph[vert],然后计算read[&val],最后计算read(&ch);
3:可以具体的说说上面的函数调用代码在内存中的函数调用栈是如何实现的吗?
[解决办法]
因为 insert最后一个参数 需要先调用read,所以会先调用read然后调用 insert
2一般来说是从右到左
不过不要写出这种依赖顺序的代码
[解决办法]
表示参与了。
[解决办法]
楼上说的很清楚了!
1. 代码没有语法错误!
2. 执行结果依赖于编译器,以及编译选项(比如使用优化)
3. 在编程实践中不要使用这样的代码!
有一句被说滥了的话
程序首先是给人读的,然后才是给机器去运行的!
[解决办法]
厄....如果lz的意思是可便参数个数问题的话...那得看insert的实现支不支持了....
如果insert是采用变参数定义,像printf/scanf一样,或者insert是个重载函数,再或者insert提供了默认形参值.....那么编译应该没问题. 后两者都是C++的内容........