Nasıl döngüler ve koşullu ifadeler çalışma olmadan 1000 1 yazdıran C kodu mu?
prints from 1 to 1000 without loops or conditionals C
kod buldum :
Ama nasıl çalıştığını anlamıyorum. Herkes kod geçmesi ve her satırı açıklayabilir mi?
#include <stdio.h>
#include <stdlib.h>
void main(int j) {
printf("%d\n", j);
(&main (&exit - &main)*(j/1000))(j 1);
}
CEVAP
Hiç böyle bir kodu yazmak yok.
j<1000
, j/1000
sıfır (tamsayı bölme). Yani:
(&main (&exit - &main)*(j/1000))(j 1);
eşittir:
(&main (&exit - &main)*0)(j 1);
Olan:
(&main)(j 1);
j 1
13 *çağırır.
j == 1000
, sonra aynı çizgiler olarak ortaya çıkıyor:
(&main (&exit - &main)*1)(j 1);
Aşağı kaynar
(&exit)(j 1);
exit(j 1)
ve program bırakır.
(&exit)(j 1)
exit(j 1)
temelde aynı şeyi - C99 §6.3.2.1/4 alıntı:
Bir işlev göstergesi türü işlevi olan bir deyim. Bunun dışında işletmen işleneniveya tekli & operatörbir işlev göstergesi ile "yazındönen tip fonksiyon"türü bir ifadeye dönüştürülür"işaretçi dönen tip fonksiyon".
exit
fonksiyon bir göstergesi. Hatta &
-Adres operatör tekli olmadan, işlev işaretçisi olarak kabul edilir. (&
sadece açık hale getirir.)
Ve işlev çağrıları §6.5.2.2/1 açıklanan ve şunlardır:
Çağrılan işlev gösterir türü ifade ederişaretçi işlevivoid dönen veya bir nesne türü bir dizi türünü ve geri.
Yani exit(j 1)
çalıştığı için otomatik dönüştürme fonksiyonu türü için bir işaretçi fonksiyon yazın ve (&exit)(j 1)
eserleri ile bir açık dönüştürme için bir işaretçi fonksiyon yazın.
Bunu söyledikten sonra, yukarıdaki kodu değil uygun (main
alır ya da iki bağımsız değişken veya hiç olmayan), &exit - &main
inanıyorum ki, tanımsız göre §6.5.6/9:
İki işaretçileri düşülen,her ikisi de aynı dizi nesnesinin elemanları işaret ederya dizinin son öğe geçen bir nesne; ...
Ek (&main ...)
kendi içinde geçerli ve kullanılabilir olacaktıreğermiktar ekledi §6.5.6/7 diyor beri sıfır oldu:
Bu operatörler amaçları, bir unsuru olmayan bir nesne için bir işaretçi için dizi ile uzunluğu tek bir dizinin ilk öğe için bir işaretçi olarak aynı şekilde davranır öğe türü nesne türü.
Yani &main
sıfır ekleme tamam (ama çok kullanmayın).
Nasıl HTML kodu Sublime Text 2 kullana...
Nasıl vim "sudo" hile çalışm...
Nasıl stil için bir <select> sad...
Nasıl baskı yeni satır veya boşluk olm...
Nasıl Objective C, Swift kodu arama...