Menu

C'de Fonksiyonlar: Tanımlamak, Çağırmak ve Değer Döndürmek

C'de fonksiyonların nasıl tanımlanıp çağrılacağı - dönüş tipi, parametreler, dönüş değerleri, void fonksiyonlar, ayrıştırmanın neden önemli olduğu ve küçük adlandırılmış parçalardan kurulmuş eksiksiz bir örnek.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Neden Fonksiyonlar

Şimdiye kadarki her şey main'in içinde yaşadı. Bu, bir program birden fazla iş yapana dek işe yarar; sonra üç sorun aynı anda gelir: aynı kod bloğu üç yere kopyalanır, main kimsenin aklında tutamayacağı kadar büyür ve bir kod parçasının ne için olduğunu adlandırmanın yolu yoktur.

Bir fonksiyon üçünü de çözer. Bir kod bloğuna bir isim, kendi yerel değişkenlerini, bir girdi listesini ve geri verecek tek bir değer verir.

square bir kez yazılır ve üç kez çağrılır; biri kendi sonucu üzerinde. Zaten fonksiyon çağırıyordunuz - printf bir tanesidir, main de öyle.

Bir Fonksiyonun Anatomisi

donusTipi ad(parametreListesi) {
    // gövde
    return deger;
}

Dört parça:

  • Dönüş tipi - fonksiyonun geri verdiği değerin tipi. int, double, char, bir gösterici tipi ya da "hiçbir şey" için void.
  • Ad - bir değişken adıyla aynı kurallara uyar ve fonksiyonun ne yaptığını ya da ne ürettiğini söylemelidir.
  • Parametre listesi - her biri kendi tipiyle, virgülle ayrılmış girdiler. (void) hiç almadığı anlamına gelir.
  • Gövde - süslü parantez içindeki deyimler; dönüş tipi void değilse bir return ile biter.

pi()'nin çağrı yerinde yine de boş parantezlere ihtiyaç duyduğuna dikkat edin - onu ismin anılması değil bir çağrı yapan şey budur. Ve printBanner(20); tek başına bir deyimdir, çünkü kullanılacak bir değer üretmez.

Parametresiz bir fonksiyon için () değil (void) yazın. C'de bu ikisi farklı şeyler ifade eder ve () gevşek olandır - birazdan daha fazlası.

Çağırmak ve Döndürmek

Bir çağrı denetimi fonksiyona aktarır, gövdesini çalıştırır ve çevredeki ifadede çağrının yerini alan bir değerle geri döner.

return aynı anda iki şey yapar: değeri sağlar ve fonksiyonu anında bitirir. Aynı yoldaki bir return'den sonraki hiçbir şey çalışmaz; larger'daki erken-dönüş tarzını çalıştıran budur - else gerekmez, çünkü son satıra ulaşmak zaten a > b'nin yanlış olduğu anlamına gelir.

Bir fonksiyonun birden fazla return deyimi olabilir. Çağrı başına yalnızca birini çalıştırabilir.

void Fonksiyonlar

Değeri için değil etkisi için var olan bir fonksiyonun dönüş tipi void'dir: yazdırma, bir gösterici üzerinden bir şeyi güncelleme, çizim.

Bir void fonksiyonun içinde değersiz return; erken çıkar. Orada return birDeger; bir derleme hatasıdır; çağrıyı bir ifadede kullanmak da öyle - int x = printTable(7, 5); derlenmez ki bu tür sisteminin işini yapmasıdır.

Ayrıştırma: Asıl Mesele

Fonksiyonlar esas olarak yinelemeden kaçınmakla ilgili değildir. Uzun bir yordamı birkaç adlandırılmış adıma dönüştürmekle ilgilidir; böylece main, programın gerçekleştiriminden çok tarifi gibi okunur.

main artık dört satır çıktı ve bir hesaplamadır. Her yardımcı tek bir iş yapar, o işin ne olduğunu söyleyen bir adı vardır ve tek başına test edilebilir. Dizinin uzunluğunun ikinci bir parametre olarak yolculuk ettiğine dikkat edin: bir dizi bir fonksiyona geçirildiğinde sizeof numarası orada artık çalışmaz, çünkü dizi göstericiye dönüşür.

İşi fonksiyonlara bölmek için üç pratik kural:

  • Fonksiyon başına bir iş. Adın içinde bir "ve" gerekiyorsa muhtemelen iki fonksiyondur.
  • İhtiyacınız olanı alın, ürettiğinizi döndürün. Küresel durumu okuyan bir fonksiyon üzerine akıl yürütmek zordur ve tek başına test edilemez.
  • Bir bakışta görülecek kadar kısa. Sihirli bir satır sayısı yoktur, ama bir ekrana sığmayan bir fonksiyon genellikle içinde daha küçük bir fonksiyon saklıyordur.

Fonksiyonların Fonksiyon Çağırması

Bir fonksiyon, çoktan bildirilmiş her fonksiyonu çağırabilir; sizin yazdıklarınız dahil:

main, report'u çağırır; o sumEvens'i çağırır; o da bir döngü içinde isEven'i çağırır. Her çağrı, çağıranınkilerin üzerine yığılmış kendi taze yerel değişken kümesini alır ve döndüğünde bunlar atılır.

Yukarıdaki tanımlar bağımlılık sırasındadır - isEven, sumEvens'ten önce, o da report'tan önce - çünkü C bir fonksiyonun çağrılmadan önce bildirilmesini ister. Dosyanın aşağısında görünen birini çağırın, derleyici örtük bildirimden şikâyet eder. Genel çözüm, dosyanın tepesine yakın bir prototiptir; bu, tanımları istediğiniz gibi sıralamanızı sağlar. Kendisini çağıran bir fonksiyon da geçerli ve yararlıdır; bu özyinelemedir.

main Bir Fonksiyondur

main, çalışma zamanının sizin için çağırdığı sıradan bir fonksiyondur. int dönüş tipi programın çıkış durumudur: 0 başarı, sıfırdan farklı başarısızlık demektir ve kabuk betikleri ile derleme araçları bunu okur.

int main(void) {
    /* ... */
    return 0;
}

C99'dan beri main'in sonundan return olmadan düşmek örtük olarak 0 döndürür - yalnızca main için geçerli özel bir kural. Değer döndürmeden biten diğer her void olmayan fonksiyon, çağıran sonucu kullandığında tanımsız davranış üretir.

Diğer standart biçim, komut satırı argümanlarını alan int main(int argc, char *argv[])'dir. İkisi de doğrudur; eski öğreticiler ne derse desin void main() değildir.

Sık Yapılan Hatalar

  • void olmayan bir fonksiyonda return'ü unutmak. Çağıran o zaman çöp bir değer okur. gcc -Wall uyarır.
  • Gövdenin içinde bir parametreyle aynı adda bir değişken bildirmek. Parametreyi gölgeler ve girdiye yapmak istediğiniz atama hiçbir yere gitmez.
  • Bir fonksiyonun argümanlarını değiştirmesini beklemek. C her şeyi değerle geçirir, dolayısıyla fonksiyon kopya alır. void reset(int x) { x = 0; } çağrı yerinde hiçbir şeyi değiştirmez - sıradaki sayfanın konusu.
  • Bir çağrıda parantezleri atlamak. printBanner;, fonksiyonun adresini değerlendirip atan geçerli bir ifadedir. Derlenir, hiçbir şey yapmaz ve -Wall bunu işaretler.
  • (void) yerine () yazmak. Geçerlidir, ama eski C lehçelerinde argüman denetimini kapatır.

Sıkça Sorulan Sorular

C'de bir fonksiyon nasıl bildirilir?

Dönüş tipini, adı ve parantez içinde bir parametre listesini, ardından süslü parantez içinde gövdeyi yazın: int add(int a, int b) { return a + b; }. Hiçbir şey almayan bir fonksiyon (void) kullanır ve hiçbir şey döndürmeyenin dönüş tipi void'dir.

Bir C fonksiyonunda return ne yapar?

Fonksiyonu hemen bitirir ve çağırana bir değer verir. Değerin tipi, fonksiyonun bildirilen dönüş tipiyle eşleşmelidir. Bir void fonksiyonda erken çıkmak için çıplak bir return; yazabilir ya da onu atlayıp fonksiyonun kapanış parantezinde bitmesine izin verebilirsiniz.

C'de main neden int döndürür?

main'in dönüş değeri, işletim sisteminin ve kabuk betiklerinin okuyabildiği programın çıkış durumudur. return 0; başarı, sıfırdan farklı her değer başarısızlık demektir. C99'dan beri main'in sonuna bir return deyimi olmadan ulaşmak örtük olarak 0 döndürür.

Bir C fonksiyonu birden fazla değer döndürebilir mi?

Doğrudan hayır - return tam olarak bir değer üretir. Alışıldık çözümler, birkaç alan içeren bir yapı döndürmek ya da parametre olarak gösterici geçirip fonksiyonun fazladan sonuçlarını onlara yazmasını sağlamaktır.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA