導航:首頁 > 源碼編譯 > 編譯器不支持可變參數

編譯器不支持可變參數

發布時間:2022-07-09 00:34:20

㈠ C語言可變參數傳遞的問題

voidfun1(inta,intb,constchar*fmt,...);

voidfun2(constchar*fmt,...);.

你注意了,參數傳遞的可是const類型的,不可以改變哦~

傳遞出來的args當然也不會有變化。

(奇怪的是你的編譯器沒有報錯嗎?暈啊……)

java中方法內的可變參數怎麼使用

Java1.5增加了新特性:可變參數:


適用於參數個數不確定,類型確定的情況,java把可變參數當做數組處理。

注意:可變參數必須位於最後一項。當可變參數個數多餘一個時,必將有一個不是最後一項,所以只支持有一個可變參數。因為參數個數不定,所以當其後邊還有相同類型參數時,java無法區分傳入的參數屬於前一個可變參數還是後邊的參數,所以只能讓可變參數位於最後一項。


可變參數的特點:

(1)、只能出現在參數列表的最後;

(2)、...位於變數類型和變數名之間,前後有無空格都可以;

(3)、調用可變參數的方法時,編譯器為該可變參數隱含創建一個數組,在方法體中一數組的形式訪問可變參數。

publicclassVarable{
publicstaticvoidmain(String[]args){
System.out.println(add(2,3));
System.out.println(add(2,3,5));
}
publicstaticintadd(intx,int...args){
intsum=x;
for(inti=0;i<args.length;i++){
sum+=args[i];
}
returnsum;
}
}

㈢ c語言如何封裝一個帶有可變參數的方法

需要借用C語言的VA_LIST宏定義,及相關操作來實現可變參數。

VA_LIST所在頭文件:#include <stdarg.h>,用法如下:

(1)首先在函數里定義一具VA_LIST型的變數,這個變數是指向參數的指針;

(2)然後用VA_START宏初始化剛定義的VA_LIST變數;

(3)然後用VA_ARG返回可變的參數,VA_ARG的第二個參數是你要返回的參數的類型(如果函數有多個可變參數的,依次調用VA_ARG獲取各個參數);

(4)最後用VA_END宏結束可變參數的獲取。

以下是一個自定義列印介面的實現:

intmy_printf(constchar*fmt,...)//...表示參數可變
{
va_listargs;//定義va_list
staticchargc_PrintfOutBuff[1000];
va_start(args,fmt);//初始化
vsnprintf((char*)gc_PrintfOutBuff,1000,(char*)fmt,args);//這里沒有使用VA_ARG取回單個變數,而是借用vsnprinf一次性讀取。
va_end(args);//結束獲取
puts("%s",(constchar*)gc_PrintfOutBuff);//使用。
return0;
}

㈣ 為什麼編譯器不讓定義一個沒有固定參數項的可變參數函數

標准 C 要求用可變參數的函數至少有一個固定參數項, 這樣才可以使用va start()。所以編譯器不會接受下面定義的函數:
int f(...)
{
...
}

㈤ 關於Java多態以及可變形參的問題

首先,運行結果的確是sub。但不是因為「編譯器認為 int[] arr 和 int...arr 是一樣的」。而是因為:①可變參數最終會被編譯器以數組的方式存下來;然後調用的時候會優先匹配定長參數的方法,只有當定長參數的方法一個都匹配不上了,才去找非定長參數的方法;②你這個上轉型之後其實讓base這個實例擁有了兩個方法,一個是父類的不定長參數,一個是子類的定長參數方法;

傳參不報錯是因為判斷參數是否合法時匹配到了不定長參數那個方法;然後執行時優先匹配到了定長參數方法(可變參和數組存儲方式一致)。編譯器並不知道什麼可變不可變,就單純的按照規則去校驗調用;

對編譯器來說,方法名稱和參數列表組成了一個唯一鍵,稱為方法簽名,JVM 通過方法簽名決定調用哪種重載方法。

JVM 在重載方法中選擇合適方法的順序:

① 精確匹配。

② 基本數據類型自動轉換成更大表示範圍。

③ 自動拆箱與裝箱。

④ 子類向上轉型。

⑤ 可變參數。

你這個上轉型實現後,即實現了重寫,又實現了一種特殊的重載;而編譯器編譯時檢查參數合法性的時候檢查到了可變參的方法(你滑鼠挪到調用的地方你會看到,編譯器提示的你的方法是父類的可變參方法的,因為此時這個參數不是數組,是匹配不到定長參數的子類方法的);


然後編譯好具體執行的時候,編譯器哪還知道什麼定長不定長,就按照優先順序去調用方法,自然就把優先順序高的子類定長方法調用到了,不存在什麼動態綁定。


這里如果你把子類和父類的參數交換(子類是可變參數,父類是數組)那你的調用就報錯了,因為可變參兼容數組,但是數組卻不兼容可變參,這樣就只形成重寫而沒有重載,然後上轉型後就只能調用父類的方法了。就會報錯咯

㈥ 關於Java可變參數問題

你好,很高興回答你的問題。
這就是java可變參數的傳參方式,可以直接傳一個符合參數數據類型的數組,也可以是用逗號分割的多個符合參數數據類型變數。
如果有幫助到你,請點擊採納。

閱讀全文

與編譯器不支持可變參數相關的資料

熱點內容
噴油螺桿製冷壓縮機 瀏覽:579
python員工信息登記表 瀏覽:377
高中美術pdf 瀏覽:161
java實現排列 瀏覽:513
javavector的用法 瀏覽:982
osi實現加密的三層 瀏覽:233
大眾寶來原廠中控如何安裝app 瀏覽:916
linux內核根文件系統 瀏覽:243
3d的命令面板不見了 瀏覽:526
武漢理工大學伺服器ip地址 瀏覽:149
亞馬遜雲伺服器登錄 瀏覽:525
安卓手機如何進行文件處理 瀏覽:71
mysql執行系統命令 瀏覽:930
php支持curlhttps 瀏覽:143
新預演算法責任 瀏覽:444
伺服器如何處理5萬人同時在線 瀏覽:251
哈夫曼編碼數據壓縮 瀏覽:426
鎖定伺服器是什麼意思 瀏覽:385
場景檢測演算法 瀏覽:617
解壓手機軟體觸屏 瀏覽:350