C parameter pembolehubah


Kadangkala, anda mungkin menghadapi situasi di mana anda mahu fungsi mengambil bilangan parameter yang berubah-ubah dan bukannya bilangan parameter yang telah ditetapkan. Bahasa C menyediakan penyelesaian untuk situasi ini dengan membenarkan anda mentakrifkan fungsi yang menerima pembolehubah bilangan argumen bergantung pada keperluan khusus anda. Contoh berikut menunjukkan definisi fungsi sedemikian.

int func(int, ... ) {   .   .   .}int main(){
   func(1, 2, 3);
   func(1, 2, 3, 4);}

Sila ambil perhatian bahawa parameter terakhir fungsi func() ditulis sebagai elipsis, iaitu tiga titik (... Parameter sebelum elipsis sentiasa int, mewakili jumlah bilangan parameter pembolehubah yang perlu dilalui. Untuk menggunakan ciri ini, anda perlu menggunakan fail pengepala stdarg.h, yang menyediakan fungsi dan makro yang melaksanakan fungsi variadic. Langkah khusus adalah seperti berikut:

  • Tentukan fungsi Parameter terakhir ialah elipsis Parameter sebelum elipsis sentiasa int, yang mewakili bilangan. parameter.

  • Buat pembolehubah jenis va_list dalam definisi fungsi, yang ditakrifkan dalam fail pengepala stdarg.h.

  • Gunakan parameter int dan makro va_start untuk memulakan pembolehubah va_list kepada senarai parameter. Makro va_start ditakrifkan dalam fail pengepala stdarg.h.

  • Gunakan va_arg makro dan pembolehubah va_list untuk mengakses setiap item dalam senarai argumen.

  • Gunakan makro va_end untuk membersihkan memori yang diberikan kepada pembolehubah va_list.

Sekarang mari kita ikuti langkah di atas untuk menulis fungsi yang mengambil bilangan pembolehubah argumen dan mengembalikan nilai puratanya:

#include <stdio.h>#include <stdarg.h>double average(int num,...){

    va_list valist;    double sum = 0.0;    int i;    /* 为 num 个参数初始化 valist */
    va_start(valist, num);    /* 访问所有赋给 valist 的参数 */    for (i = 0; i < num; i++)    {
       sum += va_arg(valist, int);    }    /* 清理为 valist 保留的内存 */
    va_end(valist);    return sum/num;}int main(){
   printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2,3,4,5));
   printf("Average of 5, 10, 15 = %f\n", average(3, 5,10,15));}

Apabila kod di atas Apabila disusun dan dilaksanakan, ia menghasilkan keputusan berikut. Perlu diingat bahawa fungsi average() dipanggil dua kali, dan setiap kali parameter pertama mewakili jumlah bilangan parameter pembolehubah yang diluluskan. Ellipses digunakan untuk menghantar bilangan argumen yang berubah-ubah.

rreeee