Hiç böyle kod yazmayın.
Çünkü j<1000, j/1000sı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ı mainile 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 .
exitbir 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 ( mainya iki argüman alır ya da hiç &exit - &mainalmaz) 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 &maintamam olurdu (ama çok kullanmak değil).
mainC ++ ile çağrı yapamazsınız .