Hiç böyle kod yazmayın.
Çünkü j<1000
, j/1000
sıfırdır (tamsayı bölümü). Yani:
(&main + (&exit - &main)*(j/1000))(j+1);
şuna eşittir:
(&main + (&exit - &main)*0)(j+1);
Hangisi:
(&main)(j+1);
Hangi çağrıları main
ile j+1
.
Eğer j == 1000
, o zaman aynı çizgiler şu şekilde ortaya çıkar:
(&main + (&exit - &main)*1)(j+1);
Hangi aşağı kaynar
(&exit)(j+1);
Hangi exit(j+1)
programdan ayrılır.
(&exit)(j+1)
ve exit(j+1)
aslında aynı şeydir - C99 §6.3.2.1 / 4'ten alıntı:
İşlev belirleyici, işlev türüne sahip bir ifadedir. Sizeof operatörünün veya unary & operatörünün işleneni dışında, " işlev döndüren tür " türüne sahip bir işlev belirleyici " işlev döndüren tür" işaretçisine sahip bir ifadeye dönüştürülür .
exit
bir fonksiyon göstergesidir. &
Operatörün tek adresi olmadan bile , işlev gösterecek bir işaretçi olarak kabul edilir. ( &
Sadece açık yapar.)
Ve işlev çağrıları §6.5.2.2 / 1 ve aşağıda açıklanmıştır:
Aranan işlevi ifade eden ifade, void döndüren veya dizi türü dışında bir nesne türü döndüren işlev için tür işaretçisine sahip olmalıdır .
Bu nedenle exit(j+1)
, işlev türünün bir işaretçi-işlev türüne otomatik dönüşümü nedeniyle çalışır ve işaretçi-işlev türüne (&exit)(j+1)
açık bir dönüştürme ile de çalışır.
Bununla birlikte, yukarıdaki kod uygun değildir ( main
ya iki argüman alır ya da hiç &exit - &main
almaz) ve bence §6.5.6 / 9'a göre tanımlanmamıştır:
İki işaretçi çıkarıldığında, her ikisi de aynı dizi nesnesinin öğelerini veya dizi nesnesinin son öğesinin ötesini işaret eder; ...
Ekleme (&main + ...)
kendi içinde geçerli olacaktır ve, kullanılabilir , eğer miktar sıfırdı eklendi §6.5.6 / 7 demesinden itibaren
Bu işleçlerin amaçları doğrultusunda, bir dizinin bir öğesi olmayan bir nesneye işaretçi, bir uzunluk dizisinin birinci elemanına bir öğe işaretçisi olan nesnenin tipi ile bir işaretçi gibi davranır.
Yani sıfır eklemek &main
tamam olurdu (ama çok kullanmak değil).
main
C ++ ile çağrı yapamazsınız .