最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言中不定參數(shù)?...?的語法以及函數(shù)封裝

 更新時間:2023年01月28日 10:42:25   作者:錦天  
不定參數(shù)是指函數(shù)可以接收不確定個數(shù)的參數(shù),下面這篇文章主要給大家介紹了關(guān)于C語言中不定參數(shù)?...?的語法以及函數(shù)封裝的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下

Intro

有一天看C代碼看到某個方法有這樣的定義:在函數(shù)形參列表處,有...的寫法,就像Java中的不定參數(shù)那樣。
如:

int	 printf(const char * __restrict, ...) __printflike(1, 2);
int	 scanf(const char * __restrict, ...) __scanflike(1, 2);

那么C語言中的不定參數(shù)特性,是怎樣使用的呢,以及我們?nèi)绾卫迷撎匦?,封裝自己的函數(shù)?

語法測試

依賴庫

需要用到 stdarg.h 中的三個函數(shù):

#define va_start(ap, param) __builtin_va_start(ap, param)
#define va_end(ap)          __builtin_va_end(ap)
#define va_arg(ap, type)    __builtin_va_arg(ap, type)

新函數(shù)使用測試:遍歷并打印不定參數(shù)中的值

主要是測試一下上面提到的三個庫函數(shù)的使用。

#include <stdio.h>
#include <stdarg.h>

// 聲明列表的結(jié)束值
#define ARGUMENTS_END_VALUE -1

void printMultiArgs(int firstArgs, ...) {

    // 聲明參數(shù)列表的變量
    va_list ap;
    
    // 初始化參數(shù)列表
    va_start(ap, firstArgs);
    printf("%d\n", firstArgs);
    
    int currValue;
    while ((currValue = va_arg(ap, int)) != ARGUMENTS_END_VALUE) {
        printf("%d\n", currValue);
    }

    // 結(jié)束參數(shù)列表
    va_end(ap);
}

int main(int argc, const char * argv[]) {
    printMultiArgs(1,2,3,4,5,6,7,8,9, ARGUMENTS_END_VALUE);
    return 0;
}

用兩種方式封裝函數(shù):對多個int值求和

//
//  main.c
//  C不定參數(shù)
//
//  Created by wuyujin1997 on 2023/1/23.
//

//#define va_start(ap, param) __builtin_va_start(ap, param)
//#define va_end(ap)          __builtin_va_end(ap)
//#define va_arg(ap, type)    __builtin_va_arg(ap, type)

#include <stdio.h>
#include <stdarg.h>

// 聲明列表的結(jié)束值
#define ARGUMENTS_END_VALUE -1

void printMultiArgs(int firstArgs, ...) {

    // 聲明參數(shù)列表的變量
    va_list ap;
    // 初始化參數(shù)列表
    va_start(ap, firstArgs);
    printf("%d\n", firstArgs);
    
    int currValue;
    while ((currValue = va_arg(ap, int)) != ARGUMENTS_END_VALUE) {
        printf("%d\n", currValue);
    }

    // 結(jié)束參數(shù)列表
    va_end(ap);
}


/// 對多個int變量求和(需要提前約定好參數(shù)結(jié)束的標(biāo)志值 ARGUMENTS_END_VALUE)
/// - Parameter firstArgs: <#firstArgs description#>
int sum1(int firstArgs, ...) {
    int result = 0;
    
    va_list ap;
    va_start(ap, firstArgs);
    result+= firstArgs; // 手動處理第一個參數(shù)
    int currValue;
    while ((currValue = va_arg(ap, int)) != ARGUMENTS_END_VALUE) {
        result += currValue;
    }
    va_end(ap);
    
    return result;
}


/// 對多個int變量求和(需要主動本方法:不定參數(shù)的個數(shù)是多少)
/// - Parameters:
///   - count: 不定參數(shù)的個數(shù)
///   - firstArgs: 第一個參數(shù),顯式的形參
int sum2(int count, int firstArgs, ...) {
    int result = 0;
    
    va_list ap;
    va_start(ap, firstArgs);
    result += firstArgs;
    for (int i = 1; i < count; i++) {
        int currValue = va_arg(ap, int);
//        printf("%d  %d\n", i, currValue);
        result += currValue;
    }
    va_end(ap);
    
    return result;
}

int main(int argc, const char * argv[]) {

    printMultiArgs(1,2,3,4,5,6,7,8,9, ARGUMENTS_END_VALUE);
    printf("sum1  %d\n", sum1(1,2,3,4,5,6,7,8,9, ARGUMENTS_END_VALUE));
    int LENGTH = 9;
    printf("sum2  %d\n", sum2(LENGTH, 1,2,3,4,5,6,7,8,9, ARGUMENTS_END_VALUE));

    return 0;
}

執(zhí)行結(jié)果:

總結(jié)

  • 需要引入頭文件 #include <stdarg.h>
  • 一個新類型,三個新函數(shù)
    • 類型 va_list
    • 函數(shù),其中 ap 為 va_list 類型的變量。
      • va_start(ap, param) param為不定參數(shù)列表的第一個參數(shù)。
      • va_arg(ap, type) 不定參數(shù)中變量的類型嗎,如int, short, long 等。
      • va_end(ap)
  • 如何確定 va_arg 的size/有多少個元素? 沒有原生的屬性/變量可以告訴我們。
    • 約定一個值作為 end_value ,而且要保證:這個值不會出現(xiàn)在傳入的多個參數(shù)值中。
    • 在咱自己封裝的函數(shù)中,新增一個參數(shù)用于告知被調(diào)函數(shù)內(nèi)部:本次不定參數(shù)的size是多少。
  • 注意不定參數(shù)的類型匹配。

總結(jié) 

到此這篇關(guān)于C語言中不定參數(shù) ... 的語法以及函數(shù)封裝的文章就介紹到這了,更多相關(guān)C語言不定參數(shù) ...內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言中static的作用及C語言中使用靜態(tài)函數(shù)有何好處

    C語言中static的作用及C語言中使用靜態(tài)函數(shù)有何好處

    在C語言中,static的作用有三條:一是隱藏功能,二是保持持久性功能,三是默認(rèn)初始化為0。本文重點給大家介紹C語言中static的作用及c語言中使用靜態(tài)函數(shù)有何好處,對本文感興趣的朋友一起看看吧
    2015-11-11
  • C語言中的sscanf()函數(shù)使用

    C語言中的sscanf()函數(shù)使用

    本文主要介紹了C語言中的sscanf()函數(shù)使用,sscanf通常被用來解析并轉(zhuǎn)換字符串,可以實現(xiàn)很強大的字符串解析功能,下面就一起來了解一下
    2023-05-05
  • C++容器std::vector的swap()函數(shù)使用方式

    C++容器std::vector的swap()函數(shù)使用方式

    這篇文章主要介紹了C++容器std::vector的swap()函數(shù)使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++存儲方案和動態(tài)分配

    C++存儲方案和動態(tài)分配

    這篇文章主要介紹了C++存儲方案和動態(tài)分配,
    2021-12-12
  • C語言編程C++柔性數(shù)組結(jié)構(gòu)示例講解

    C語言編程C++柔性數(shù)組結(jié)構(gòu)示例講解

    這篇文章主要介紹了C語言編程系列中的柔性數(shù)組,文中含有詳細(xì)的示例代碼講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • Visual?Studio?2022?配置?PCL?1.12.1?的問題小結(jié)

    Visual?Studio?2022?配置?PCL?1.12.1?的問題小結(jié)

    這篇文章主要介紹了Visual?Studio?2022?配置?PCL?1.12.1?的經(jīng)驗總結(jié)分享,本文通過圖文實例相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • C/C++中指針和引用之相關(guān)問題深入研究

    C/C++中指針和引用之相關(guān)問題深入研究

    從內(nèi)存分配上看,程序為指針變量分配內(nèi)存區(qū)域,而不為引用分配內(nèi)存區(qū)域,因為引用聲明時必須初始化,從而指向一個已經(jīng)存在的對象。引用不能指向空值
    2013-10-10
  • C語言中strcmp的實現(xiàn)原型

    C語言中strcmp的實現(xiàn)原型

    這篇文章主要介紹了C語言中strcmp的實現(xiàn)原型的相關(guān)資料,這里提供實例幫助大家理解這部分內(nèi)容,希望能幫助到大家,需要的朋友可以參考下
    2017-08-08
  • C++深入分析數(shù)據(jù)在內(nèi)存中的存儲形態(tài)

    C++深入分析數(shù)據(jù)在內(nèi)存中的存儲形態(tài)

    使用編程語言進(jìn)行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個變量時,就會在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么
    2023-01-01
  • 詳解C語言中typedef和#define的用法與區(qū)別

    詳解C語言中typedef和#define的用法與區(qū)別

    這篇文章主要給大家介紹了關(guān)于C語言中typedef和#define的的用法、區(qū)別,以及陷阱。文中通過示例進(jìn)行了詳細(xì)講解,感興趣的小伙伴可以了解一下
    2022-07-07

最新評論

呼和浩特市| 永登县| 西畴县| 阳东县| 昌平区| 通化县| 南汇区| 天镇县| 台安县| 逊克县| 吉林省| 贵港市| 宿州市| 赞皇县| 龙井市| 孝昌县| 孝昌县| 湘潭县| 沙河市| 鄯善县| 颍上县| 东山县| 宁河县| 江西省| 织金县| 积石山| 东海县| 新乡县| 色达县| 杭锦后旗| 龙泉市| 江油市| 常山县| 资溪县| 罗江县| 含山县| 澳门| 余庆县| 新源县| 察哈| 扶余县|