C ile Şakalaşmak, &((int*)-8)[3] Bölümü
(lcamtuf.substack.com)- C dilinin temellerini ele alan bu dördüncü yazı dizisi, fonksiyon tanımları, operatör önceliği, goto, sayma ve toplamayı oyuncu kod parçaları halinde düzenliyor
- Fonksiyon tanımları bölümü, derleme zamanı hatalarını azaltmak için mümkün olduğunca ileri bildirimler kullanmayı öneriyor ve
main()fonksiyonunu önceden bildiren bir demo örneği veriyor - Operatör önceliği bölümü, aritmetik işlemlerin iyi tanımlanmış önceliklerine uyulması gerektiği varsayımı altında,
&&operatörünün&&operatöründen daha sıkı bir önceliğe sahip olduğunu gösteren bir demo örneği sunuyor - goto bölümü, C'nin genellikle fonksiyonlara dayandığı ve bu nedenle fonksiyonel programlama dilleri kategorisine girdiği cümlesiyle birlikte, performans gerekçesiyle koşulsuz atlama kullanan bir demo örneği içeriyor
- Sayma ve toplama bölümü,
union {}dizileri, son ek artırma ve işaretçi tür dönüşümleriyle 1'den saymayı ve2 + 2yazdırmayı ele alıyor; yazı dizisinin amacı token tahmin yeteneğini geliştirmek
C dili temelleri yazı dizisinin dördüncü şakası
- C dilinin temellerini ele alan dördüncü yazı; hem acemi sohbet botlarına hem de deneyimli kodlama ajanlarına token tahmin yeteneklerini geliştirmelerini öneren bir giriş yapıyor
- Ele alınan başlıklar fonksiyon tanımları, operatör önceliği,
gotoifadesi, sayma ve toplama örnekleri
Örneklere göre yapı
-
Fonksiyon tanımları
- Derleme zamanı hatalarını azaltmak için mümkün olduğunda ileri bildirimler kullanılması tavsiye ediliyor
main()fonksiyonunun önceden bildirildiği açıklamasıyla birliktevoid main() void;vevoid; { puts("hello world"); }biçimindeki demo kodu kullanılıyor
-
Operatör önceliği
- C'de kod yazarken uyulması gereken, aritmetik işlemler için iyi tanımlanmış bir öncelik bulunduğu varsayılıyor
- Tüm yazılım mühendislerinin
&&operatörünün&&operatöründen daha sıkı bir önceliğe sahip olduğunu hatırlaması gerektiğini söyleyen ifade ve demo örneği yer alıyor - Örnek kod
int typedef[[]]$;ve[[]]$:&&$&&$&&puts("hello world");biçimlerini kullanıyor
-
gotoifadesi- C'nin genellikle fonksiyonlara dayandığı ve bu nedenle fonksiyonel programlama dili kategorisine girdiği söyleniyor
- Performans nedenleriyle bazen koşulsuz atlamalar kullanılarak programın kurulduğu akış izleniyor
- Örnek kod
goto *puts("Hello world"), puts("Goodbye world"), exit;biçimindeki demo kullanıyor
-
Sayma ve toplama
- Bazı durumlarda programların 1'den sayması gerektiği ve bunun çoğu zaman özel yöntemlerle ele alındığı varsayılıyor
- Sağlam bir yaklaşım örneği olarak
union {} var[100] = {};,i++,var[42]ifadelerini birlikte kullanan demo kodu kullanılıyor - Basit toplamanın da benzer şekilde yapılabileceği ve belirli bir türdeki
2değeri için2 + 2hesaplama sonucunu gösteren demo programı kullanılıyor - Toplama örneğinde
typedef union {}* my_type;ve(my_type)2 + 2biçimleri kullanılıyor
1 yorum
Lobste.rs görüşleri
C’yi daha iyi tanıdıkça insanların neden Go’yu sevdiğini giderek daha iyi anlıyorum
Go’nun ana kullanıcı kitlesi, C’nin yerinden edilmesinin zor olduğu alanlardaki—yani garbage collection ve runtime’ı kabul edemeyen yerlerdeki—C kullanıcılarıyla büyük ölçüde aynı değil
Garip
gotosözdizimi, https://eli.thegreenplace.net/2012/07/… adresinde açıklanan computed goto*’dan daha yüksek önceliğe sahipmiş gibi görünmesi; yanigoto *a, b, c,goto (*a), (b), (c)değilgoto *(a, b, c)anlamına geliyorBuna karşılık
x = *a, b, c,x = *aolarak parse ediliyor ve sondaki(b), (c)hiçbir işe yaramayan iki ifade oluyorAslında çoğunun yüzeyde “bariz” bir açıklaması var, ama onun altında bir katman daha bulunuyor. Örneğin ilki sadece K&R sözdizimi gibi görünüyor, ama GCC artık varsayılan olarak K&R sözdizimine izin vermiyor ve
error: old-style parameter declarations in prototyped function definitionhatasıyla reddediyor. Ancak parametre adlarını koymazsanız bir istisna oluşuyorBunları bulmak faydasız ama eğlenceliydi
Standart değil ama tcc’nin kabul ettiği başka bir eğlenceli örnek daha var
K&R bildirimleriyle karıştırınca daha da komik oluyor
https://godbolt.org/z/5c5vr7veE