以前一直用printf()来写输出到显示器的操作,其实也是最近才发现printf()竟然是一个很奇怪的可变参数的
函数,通过printf的原型可以看出在c语言中实现参数可变的具体方法;
- exp:
- printf(const char* format, ...);
- 源码:
- #define printf xmon_printf
- void xmon_printf(const char *format, ...)
- {
- va_list args;
- int n;
- char xmon_buf[1024];
- va_start(format, args);
- n = vsnprintf(xmon_buf, sizeof(xmon_buf), format, args);
- va_end(args);
- xmon_write(xmon_buf,n);
- }
上面的具体程序就是在相应的头文件中的printf()函数体,其实对这个函数的实现我也不是特别清楚,但是感觉相当
神奇,java和c中都是使用的数组进行组合参数的,js中使用的是伪数组,
通过四处搜索,可能的解释是因为:
C语言允许变长参数的具体实现,因编译器而异。多数仍然是通过栈来实现,
因为参数的使用和记录都是由编译器维护,所以程序员多数情况下不用理会如何获得参数。
如果是通过栈来实现的话那么寄存器以及ESP EIP的维护交给编译器是十分明智的做法,靠人工来进行维护显然是不合适的
,今天我想说的是关于java中的可变参数方法的定义以及注意事项,全都是亲身体会哦,先看书然后写程序。
1)
根据文档说是在java 1.5的时候引进了可变参数方法的技术的,也就是说这个和args的使用方法是相当的,还有一点
就是说,也是根据文档,可变参数的调用也是使用了类似数组的方法,可以使用x.length方法获得它的长度,但是是
不可以修改其中的内容的,而且看下面的例子
- package testargs;
- public class testargs{
- public void hello(String ...args)
- {
- System.out.println("可变参数的hello方法的长度是"+args.length);
- //args.append("hello2you");
- for(String s:args)
- System.out.print(s+" ");
- }
- public static void main(String[] args)
- {
- testargs tst=new testargs();
- tst.hello("hello","hello","hello");
- }
使用最简单的方法,可以看出我们可以得到我们预见的结果,这是很正确的;
看下面的测试程序:
- package testargs;
- public class testargs{
- public void hello(String ...args)
- {
- System.out.println("可变参数的hello方法的长度是"+args.length);
- //args.append("hello2you");
- for(String s:args)
- System.out.print(s+" ");
- }
- public void hello(String[] args)
- {
- System.out.println("字符数组的hello方法的参数长度是"+args.length);
- for(String s:args)
- System.out.println(s);
- }
- public static void main(String[] args)
- {
- testargs tst=new testargs();
- tst.hello("hello","hello","hello");
- }
- }
是的我用重载的方法重新写了一个hello方法,然而这次我不使用可变string参数,而我用的是一个
string数组,因为这样可以达到相同的功效,但是可见我并没有成功,因为编译的时候出现了错误,
看来是编译器有意这么告诉我的,是的不信的话可以重新编译一下,会提示不能同时使用可变参数和数组
重载同一个函数,可以很清晰的看到我们的可变参数的调用方法也是使用的数组的形式,而且实验证明也确实如此,
而且多参数方法可以传递一个数组给它,反过来就不可以了。
这个也是昨天看的吧,周末生病了,我想写点好点的程序,但是最近苦于没什么创意,而且在学习web UI的创作,
在书店看上一本画册,死活没舍得买下来,我我我我我,真的是好想要呀,还是攒钱买ipad2吧!