以前一直用printf()来写输出到显示器的操作,其实也是最近才发现printf()竟然是一个很奇怪的可变参数的
- 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);
- }
神奇,java和c中都是使用的数组进行组合参数的,js中使用的是伪数组,
通过四处搜索,可能的解释是因为:
C语言允许变长参数的具体实现,因编译器而异。多数仍然是通过栈来实现,
因为参数的使用和记录都是由编译器维护,所以程序员多数情况下不用理会如何获得参数。
如果是通过栈来实现的话那么寄存器以及ESP EIP的维护交给编译器是十分明智的做法,靠人工来进行维护显然是不合适的
,今天我想说的是关于java中的可变参数方法的定义以及注意事项,全都是亲身体会哦,先看书然后写程序。
1)
- 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");
- }
- }