㈠ c語言傳遞變長參數
按照你現在給出的代碼,
print2(3, 100, 1, 2, 3);
輸出的是1 2 3加上一位不確定值
因為va_start(vl, n);這一步理論上可以得到以a開頭的va_list指針,但實際上由於編譯器優化,它的效果和va_start(vl, a);是相同的
這一點,你可以列印出指針地址來確定一下
從你的代碼推測,你是想讓print2列印出後四個參數,包括a在內
即 100 1 2 3
如果是這樣 可以用另一種方式做到
print2中,不要調用va_start
而是直接 vl=&a;
如下
void print2(int n, int a, ...)
{
va_list vl;
// va_start(vl, n);//使用倒數第二個有名變數
vl = &a;//編譯器想優化 不讓。 直接強勢插入
vprint(n+1, vl);
va_end(vl);
}
可以試一下是否是你需要的效果。 如果不是 再追問
㈡ java 可變參數是什麼
java 可變參數是1.5版本的新特性,也就是說用戶若是想定義一個方法,但是在此之前並不知道以後要用的時候想傳幾個參數進去,可以在方法的參數列表中寫參數類型或者數組名,然後在方法內部直接用操作數組的方式操作。
java可變長的形參聲明格式:dataType...parameters。
其中,省略號表示數據類型為dataType的parameters參數個數不固定的,可為任意個。此外,在方法調用時,變長形式參數可被替換成1個、2個或多個參數。在編譯時,方法的變長參數將被看成具有相同類型的一維數組。
在java語言開發中,從JDK1.5以後,java允許定義形參長度可變的參數從而允許為方法指定數量不確定的形參。
㈢ java 函數參數object...這樣的變長參數調用的時候可以省略不寫嗎
可以,這就是java的不定長參數,下面進行簡要介紹:
先看兩個簡單的例子,來感受一下Java的不定長度參數
第一個例子:
public class VariArgs {
public static void main(String[] args) {
test();
test("aaa");
test("aaa", "bbb");
test("aaa", "bbb", "ccc");
}
public static void test(String... args) {
System.out.println(args.getClass());
for (String arg : args) {
System.out.println(arg);
}
}
}
第二個例子:
public class VariArgs {
public static void main(String[] args) {
test("aaa");
test("aaa", "bbb");
test("aaa", "bbb", "ccc");
}
public static void test(String arg, String... args) {
System.out.println(arg);
System.out.println("----------------");
for (String s : args) {
System.out.println(s);
}
}
}
從上面可以看出,如果一個方法的參數定為不定參數的話,這個參數可以根據參數個數動態生成一個數組,然後傳入方法執行。
不過,不定參數有兩個規定:第一,方法的參數列表中最多隻有一個不定長度的參數;第二,就是不定長度的數組的位置必須是最後一個參數。不然不能通過編譯。
對於第一個規定,是因為如果有多於一個不定長度的參數,當真正調用這個方法的時候,JVM、將不知道前面的不定長度參數有多長, 下一個參數是從哪裡開始.
對於第二個參數也是一樣,編譯器不知道不定長度參數的長度,無法確定從哪裡開始下一個參數。
㈣ 關於標准C語言參數個數的問題
標准C不像C++一樣支持可變形參數量?
那printf算什麼?
是四個參數,要是加逗號不可能通過編譯。
宏不就是替代嗎?
c++的話,就是
CvMat cvMat( int rows, int cols, int type, void* data =NULL)//預設參數
{
}
c的話,沒有默認參數,所以調用時最後一個參數必須的
CvMat cvMat( int rows, int cols, int type, void* data)
{
}
㈤ 影響vs編譯速度的因素有哪些
影響因素比較多:
1 文件的大小,文件大小指的是全部include展開後的大小。
2 文件數量,編譯是一個一個文件進行的,所以你的工程的文件數量也有關系。
3 還有聲明的復雜程度,復雜聲明需要額外地計算。
4 最影響編譯速度的估計是C++的模板,模板在編譯的時候要進行推導,得到相應的結果,這個非常費時間。如果你是模板里還套了模板,那就比較慢了。
5 鏈接庫的數量,鏈接很多庫也會使得編譯速度變慢。
6 inline函數展開,會使得代碼膨脹,也會影響編譯速度
7 debug模式編譯要留符號表做調試,也會影響速度
8 release模式如果開了優化,編譯優化會改變代碼的某些結構,這也是拖慢編譯器的一個重要因素。
㈥ 模板函數為什麼類型參數可以不止一個
不知道你說的是模板函數的定義還是它的調用。
對於定義:
模板函數可能不止包含一個參數,可能多個參數都要設計成通用的,所以需要讓它們都變成可變的(對於一個可變的參數,在調用時會被實例成一個確定的參數,所以不可能既是A又是B)
對於調用:
因為定義模板函數時沒有給出參數類型,所以需要給它們一個確定的類型,否則編譯器無法確定該把他們的處理用什麼命令來實現。如果這個模板函數有多個可變參數,顯然需要給它們分別指定類型。
㈦ 3. 如果一個函數參數列表很長,那麼會帶來怎樣的負擔你有什麼解決方案
首先一個前提是這些參數都是有用的,在這個前提下討論辦法。函數的參數列表很長,不僅書寫麻煩,閱讀也不便,而且太長的列表容易寫錯,造成編譯錯誤,影響調試時效。
1.可以把函數重載為多個形參較少的同名函數;
2.參數列表長,但每次調用往往用不了全部,可以定義一些默認參數,並安排好順序,調用時就可以少寫不少,節省很多功夫;
3.如果是現成的長參數列表函數,在你的程序中用的參數又並不多,可以根據需求重寫一個參數較少的函數調用它;只做一次的事再復雜也較易解決;
4.如果調用時每個參數都得用,那隻好認了;這正是長參數列表存在的意義。