web-dev-qa-db-ja.com

セミコロンとIF / WHILE / FORステートメントのないCのhello world

私の友人は、IF/WHILE/FORおよびセミコロンなしで「hello world」を出力するCプログラムを書くことができると言っています。最小限の調査の後、私はそれが不可能だと彼女に言いました。出来ますか?

私は、インクルードファイルからセミコロンを盗む「ポータブル」な方法を見つけようとしています。これはLinuxで動作します:

int main(int ac, char **av)
{
#define typedef
#define uint8_t a[printf("hello world\n")]
#include <stdint.h>
}

これにより、1つのtypedef unsigned char uint8_tは私のprintfになります。

働いた別のトリックは、#definestdint.hは、セミコロンの束になります。

これらは両方ともFreeBSDでフラットになります。これは、プライベートな中間型(__uint8_t)これは、引用された例ではtypedefの削除に失敗し、他の場合ではセミコロン以外のすべてを正常に削除できないことを意味します。

インクルードファイルからセミコロンをきれいに盗むことが可能であるべきだと思われます。誰かが私の試みを改善できますか?

74
Ben Jackson
#include <stdio.h>

int main() {
    switch (printf("Hello, world!\n")) {}
}

友人が「ああ、スイッチも使えない」と言ったら:

#include <stdio.h>

int main(int argc, char *argv[printf("Hello, world!\n")]) {}
197
cdhowie

質問の正確な文言に依存するため、これを提案するかどうかが心配です。

#error hello world

(他に何もなければ、おそらく「mainなしでhello worldを印刷するにはどうすればよいか...」

41
Ben Jackson

iF/WHILE/FORおよびセミコロンなしで「hello world」を出力するCプログラムを作成することができます。

簡単です。 Cでは大文字と小文字が区別されることに注意してください。

int main()
{
    if (printf("Hello, World\n")){}
}

ifはCのキーワードですが、IFはそうではありません。

19
JeremyP

次のような制限を回避することもできます

#define X i##f
#define Y whi##le
#define Z f##or
#define W swi##tch
16
kennytm

どうですか:

#include <stdio.h>
int main(void *HAHA[printf("Hello world!\n")]) {}

クールではない:)

15
steabert

switchステートメントを使用して、希望する出力を取得できます。以下にコードを示します。

#include<stdio.h>

int main()
{
  switch(printf("hello world"))

return 0;
}

これがあなたを助けることを願っています

2
Zishan