用法
使用環境 | 含義 |
---|
| |
| |
| |
| “...”通常可以表示無語、被冷到、被傷到、被寒到等等諸多感受,或在無話可說無感受時回復發言者. |
| 等同於“..”,“汗..”“寒..”即無語、被雷到的意思…… |
運算符
C語言中
可變參數函式(Variadic functions)是
stdarg.h內容典型的套用,雖然也可以使用在其由可變參數函式調用的函式(例如,
vprintf)。
聲明可變參數函式
可變參數函式的參數數量是可變動的,它使用省略號來忽略之後的參數。例如
printf函式一般。
代表性的聲明為:
int check(int a, double b, ...);
可變參數函式最少要有一個命名的參數,所以
char *wrong(...);
在C中是不被允許的(在C++中,這樣的聲明是合理的)。C中,省略符號之前必須要有逗號;而在C++中,則沒有這種強制要求。
定義可變參數函式
使用相同的語法來定義:
longfunc(char,double,int,...);
longfunc(chara,doubleb,intc,...)
/*...*/
//在C的舊形式中可能會出現較省略的函式定義:
longfunc();
chara;
doubleb;
longfunc(a,b,c,...)
/*...*/
訪問未命名的參數,首先必須在可變參數函式中聲明
va_list類型的變數。調用
va_start並傳入兩個參數:第一個參數為va_list類型的變數,第二個為省略號前最後一個有名字的參數的名稱,接著每一調用
va_arg就會返回下一個參數,va_arg的第一個參數為va_list,第二個參數為返回的類型。最後
va_end必須在函式返回前被va_list調用(va_list當作參數)(沒有要求要讀取完所有參數)。
C99提供額外的宏,va_copy,它能夠複製va_list。而va_copy(va2, va1)函式作用為拷貝va1到va2。
沒有機制定義該怎么判別傳遞到函式的參數量或者
數據類型。函式通常需要知道或確定它們變化的方法。共通的慣例包含:
在可變參數最後的標記值(sentinel value)。
總數變數來指明可變參數的數量。
C++中
聲明方法: template <typename...
Types> //...
例如:
template<typenameT,typename...Args>
voidshow_list(Tvalue,Args...args)
cout<<value<<endl;
show_list(args);//遞歸調用,顯示下一項
Java中
在編寫一個方法時,其參數隨著程式運行的條件而變化,在編譯期間無法確定。具體地講,例如編寫一個列印參加聚會party的程式,其中方法printInvitation()將根據作為參數的參加人姓名,列印邀請卡。但這個參數的數量事先並不確定。當然可以編寫許多重載的方法來解決這個問題,如:
void printInvitation(String name);
void printInvitation(String name1, Stringname2);
void printInvitation(String name1, Stringname2, String name3);
問題是編寫多少個重載的方法才可以解決給所有參加者列印邀請卡.也許需要改變您的程式設計,而使用數組或者連結表了。
套用可變參數可以方便、靈活地解決這類問題。例如:
void printInvitation(String...names)
for (String name : names)
(makeCard(name)); //調用方法按照姓名列印邀請卡
(System.out.println("Recording info: invitation card has been printed for " + name));
這裡,(String...names)便是可變參數。該參數包括從0到任意個相同類型的參數。在編譯期間,這個可變參數將被轉換為
字元串數組形式,即:void printInvitation(String names).
如下是調用這個方法的例子:
printInvitation(); //無參數
當在無參數情況下調用這個方法時,將不執行任何這個方法中的
代碼。
如下是運行結果:
Recording info: invitation card has been printed for 李剛
Recording info: invitation card has been printed for David Smith
Recording info: invitation card has been printed for Greg Wu
Recording info: invitation card has been printed for Paul Nguyen
Recording info: invitation card has been printed for Liu Wei
Recording info: invitation card has been printed for 張新