0Pricing
C Academy · Ders

stdarg Makroları

va_list, va_start, va_arg

stdarg Makroları, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C Academy kursu toplamda 4 dersten oluşur.

Değişken sayıda bağımsız değişken alan işlevler nedir

Değişken sayıda bağımsız değişken alan işlev, değişken sayıda bağımsız değişken kabul eder. Daha önce bir tane kullandınız: printf istediğiniz sayıda değer alabilir.

C dilinde kendi işlevlerinizi <stdarg.h> makrolarını kullanarak yazabilirsiniz.

#include <stdio.h>

int main(void) {
    printf("%d %d %d\n", 1, 2, 3);
    printf("%s\n", "any count of args");
    return 0;
}

Üç nokta

Değişken sayıda bağımsız değişken alan bir işlevi, son parametre olarak ... (üç nokta) kullanarak bildirirsiniz.

İşlevin değişken kısmın nerede başladığını bilmesi için bundan önce en az bir adlandırılmış parametre bulunmalıdır.

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

void demo(int count, ...) {
    printf("This function takes %d extra args\n", count);
}

int main(void) {
    demo(3, 10, 20, 30);
    return 0;
}

stdarg.h dosyasını ekleme

Değişken bağımsız değişkenleri okumak için #include <stdarg.h> gereklidir.

Bu dosya va_list türünü ve va_start, va_arg ile va_end makrolarını tanımlar.

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

void show(int n, ...) {
    va_list args;
    va_start(args, n);
    va_end(args);
    printf("set up and cleaned up\n");
}

int main(void) {
    show(2, 5, 6);
    return 0;
}

va_list ve va_start

Geçerli konumu izlemek için bir va_list değişkeni bildirin. Ardından son adlandırılmış parametreyi geçirerek va_start(list, last) çağrısını yapın.

Bu işlem listeyi ilk değişken bağımsız değişkene yönlendirir.

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

void first(int count, ...) {
    va_list args;
    va_start(args, count);
    int value = va_arg(args, int);
    printf("first variadic arg = %d\n", value);
    va_end(args);
}

int main(void) {
    first(1, 99);
    return 0;
}

va_arg: değerleri okuma

va_arg(list, type) sonraki bağımsız değişkeni döndürür ve listeyi ilerletir. Okunacak kesin türü belirtmelisiniz.

Her çağrı, bir bağımsız değişken kadar ilerler.

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

void three(int n, ...) {
    va_list args;
    va_start(args, n);
    int a = va_arg(args, int);
    int b = va_arg(args, int);
    int c = va_arg(args, int);
    printf("%d %d %d\n", a, b, c);
    va_end(args);
}

int main(void) {
    three(3, 7, 8, 9);
    return 0;
}

va_end: temizleme

Okumayı bitirdiğinizde her zaman va_end(list) çağrısını yapın. Bu çağrı, platformun ihtiyaç duyduğu temizleme işlemlerini gerçekleştirir.

Bunu unutmak bazı sistemlerde tanımsız davranışa yol açar.

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

int add_two(int dummy, ...) {
    va_list args;
    va_start(args, dummy);
    int sum = va_arg(args, int) + va_arg(args, int);
    va_end(args);
    return sum;
}

int main(void) {
    printf("%d\n", add_two(0, 4, 6));
    return 0;
}

Kaç bağımsız değişken olduğunu bilmek

Makrolar size kaç bağımsız değişken geçirildiğini söyleyemez. Bu bilgiyi kendiniz sağlamalısınız.

Yaygın bir yaklaşım, sum(3, a, b, c) örneğindeki gibi başta bir sayı parametresi kullanmaktır.

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

int sum(int count, ...) {
    va_list args;
    va_start(args, count);
    int total = 0;
    for (int i = 0; i < count; i++)
        total += va_arg(args, int);
    va_end(args);
    return total;
}

int main(void) {
    printf("%d\n", sum(4, 1, 2, 3, 4));
    return 0;
}

Sentinel değeri kullanmak

Sınırsız bağımsız değişkenlerin sonunu belirtmenin başka bir yolu da bir sentinel kullanmaktır: çağıranın eklemesi gereken, -1 veya NULL gibi özel bir sonlandırma değeri.

Sentinel değerini okuyana kadar döngüyü sürdürün.

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

int sum_until_neg(int first, ...) {
    va_list args;
    va_start(args, first);
    int total = first, v;
    while ((v = va_arg(args, int)) != -1)
        total += v;
    va_end(args);
    return total;
}

int main(void) {
    printf("%d\n", sum_until_neg(10, 20, 30, -1));
    return 0;
}

Varsayılan bağımsız değişken yükseltmeleri

Değişken sayıda bağımsız değişken, varsayılan yükseltmelere tabi olur: char ve short, int türüne; float ise double türüne dönüşür.

Bu nedenle küçük tam sayıları va_arg ile her zaman int, kayan noktalı değerleri ise double olarak okuyun.

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

void show_double(int n, ...) {
    va_list args;
    va_start(args, n);
    double d = va_arg(args, double);
    printf("%.2f\n", d);
    va_end(args);
}

int main(void) {
    show_double(1, 3.5f);
    return 0;
}

va_list kopyalamak

Bağımsız değişkenler üzerinde iki kez gezinmeniz gerekiyorsa okumadan önce listeyi çoğaltmak için va_copy(dest, src) kullanın.

va_end çağrısından sonra va_list değerini, va_start ile yeniden başlatmadan tekrar kullanamazsınız.

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

void twice(int n, ...) {
    va_list a, b;
    va_start(a, n);
    va_copy(b, a);
    printf("%d %d\n", va_arg(a, int), va_arg(b, int));
    va_end(a);
    va_end(b);
}

int main(void) {
    twice(1, 42);
    return 0;
}

Ortalama hesaplamak

Sayı adedi desenini kayan noktalı değer okuma ile birleştirerek değişken sayıda geçirilen sayıların ortalamasını alabiliriz.

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

double average(int count, ...) {
    va_list args;
    va_start(args, count);
    double sum = 0;
    for (int i = 0; i < count; i++)
        sum += va_arg(args, double);
    va_end(args);
    return sum / count;
}

int main(void) {
    printf("%.2f\n", average(3, 2.0, 4.0, 6.0));
    return 0;
}

Hızlı kontrol

stdarg makrolarını ne kadar anladığınızı test edin.

Özet

Değişken sayıda bağımsız değişken mekanizmasını öğrendiniz:

  • En az bir adlandırılmış parametreden sonra ... kullanarak bildirim yapın.
  • va_start(list, last) başlatır, va_arg(list, type) okur, va_end(list) temizler.
  • Makrolar adedi bilmez; bir sayı parametresi veya sentinel kullanın.
  • Varsayılan yükseltmelere dikkat edin: küçük tam sayıları int, kayan noktalı değerleri double olarak okuyun.

Sıkça Sorulan Sorular

“stdarg Makroları” dersi ücretsiz mi?

Evet — “stdarg Makroları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C Academy kursu toplamda 4 dersten oluşur.

“stdarg Makroları” dersinde ne öğreneceğim?

va_list, va_start, va_arg C Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“stdarg Makroları” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. stdarg Makroları
  2. printf Benzeri İşlevler Yazma
  3. Tür Güvenliği Kaygıları
  4. Pratik Örnekler
← C Academy Sayfasına Dön