ProgramlamaC geliştirici

C dilinde değişkenlerin bildirilmesi ve başlatılmasıyla ilgili kuralları ve incelikleri açıklayın, farklı depolama alanları için otomatik başlatmayı da dahil edin. Tanım ile bildirim arasındaki fark nedir ve bu neden önemlidir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Değişkenlerin bildirilmesi ve başlatılması, oldukça katı ve bazen gözle görülmeyen kurallara sahip C dilinin temel taşını oluşturur. Bir değişkeni nasıl ve nerede bildirdiğinize bağlı olarak, başlangıç değeri (başlatma hakkında) ve bellek nesnesi ile bağlantı (bildirim ve tanım hakkında) büyük ölçüde etkilenecektir.

Sorunun Tarihi

C, bellek optimizasyonunun öncelikli olduğu zamanlara dayanır. Geliştiriciler değişkenleri kendileri bildirmek ve başlatmak zorundaydılar; aksi takdirde programın davranışı tahmin edilemez hale gelirdi. Modern C derleyicilerinde en küçük bir sapma, bağlantı hatalarına veya belirsiz bir "çöp" ile otomatik başlatmaya neden olabilir.

Problem

Temel hatalar:

  • Otomatik değişkenler varsayılan olarak başlatılmamıştır.
  • static ve global değişkenler - sıfıra otomatik olarak başlatılır.
  • Bildirim ve tanım karıştırılır, çoklu tanım veya belirsiz sembol oluşur.

Çözüm

  • Otomatik (auto, varsayılan olarak yerel) değişkenler: başlatılmamıştır!
  • Static (static fonksiyonu, static dosya, extern olmayan global değişkenler): değer verilmemişse otomatik olarak sıfıra başlatılır.
  • Bildirim: derleyiciye değişkenin var olduğunu söyler - bellek ayırmaz (örnek: extern int x;)
  • Tanım: bellek ayırır ve (ya da başlatılmalıdır) başlatılabilir (örnek: int x = 42;)

Kod örneği:

#include <stdio.h> int global_var; // tanım, otomatik başlatma = 0 static int static_global_var; // static-dosya, otomatik başlatma = 0 extern int extern_var; // bildirim, tanım başka bir yerde void foo() { int local_var; // otomatik, başlatılmamış -> çöp static int static_local_var; // static, otomatik olarak 0'a başlatıldı }

Anahtar özellikler:

  • Değişkenin yeri otomatik başlatmayı etkiler.
  • Tanım ve bildirim aynı şey değildir!
  • extern/yok extern: değişkenler için - bildirim/tanım, fonksiyonlar için - yalnızca bildirim.

Kandırmaca Soruları.

1. Otomatik değişkenler (static ve extern olmayan yerel) derleyici tarafından otomatik olarak 0'a başlatılır mı?

Hayır, çöp içerir. Değerleri tanımlı değildir, başlangıçtan önce kullanmak hata olur.

2. Farklı dosyalarda extern ile bir değişken birden fazla kez tanımlanabilir mi?

Hayır, yalnızca bir tanım olmalı, diğerleri extern ile bildirim olmalıdır; aksi takdirde derleyici "çoklu tanım" veya "belirsiz sembol" hatası verir.

3. Bir fonksiyon bildirimi ile tanımı arasındaki fark nedir?

Bildirim - sadece prototip (gövdesiz); tanım - mutlaka fonksiyonun gövdesini içerir. Değişkenler için extern ile bildirim bellek ayırmazken, fonksiyonlar için her iki form da geçerlidir.

Tipik hatalar ve antipatternler

  • Yerel değişkenlerin otomatik olarak başlatılacağını beklemek
  • Başlık dosyalarında global değişkenlerin çoklu tanımı
  • extern kullanımının hatalı olması

Hayattan Bir Örnek

Olumsuz Durum

İki başlık dosyasında global değişken int counter; tanımlanıyor. Proje "çoklu tanım" hatasıyla bağlantılı olarak çözüldü.

Artılar:

  • Kodun hızlı bir şekilde kopyalanması

Eksiler:

  • Bağlantı hataları, derleyicinin anlaşılmaz mesajları

Olumlu Durum

Başlık dosyasında extern int counter; tanımı, yalnızca bir C dosyasında int counter = 0; ile tanımlanmıştır.

Artılar:

  • Temiz derleme, mantıklı yapı

Eksiler:

  • Bildirim/tanım ayrımını hatırlamak gerekir.