SORU
29 EKİM 2011, CUMARTESİ


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
29 EKİM 2011, CUMARTESİ


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).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • celebrateubuntu

    celebrateubu

    23 Mayıs 2011
  • Google Developers

    Google Devel

    23 AĞUSTOS 2007
  • undrmyumbrellaa

    undrmyumbrel

    25 Temmuz 2012