在没有分号且没有IF/WHILE/FOR语句的情况下,你好世界

l--*_*''' 61 c puzzle

我的朋友说,有可能编写一个C程序,打印出"hello world",不IF/WHILE/FOR带分号,不带分号.经过极少的研究,我告诉她这是不可能的.可能吗?

cdh*_*wie 197

#include <stdio.h>

int main() {
    switch (printf("Hello, world!\n")) {}
}
Run Code Online (Sandbox Code Playgroud)

如果你的朋友说"哦,你也不能使用开关",那么:

#include <stdio.h>

int main(int argc, char *argv[printf("Hello, world!\n")]) {}
Run Code Online (Sandbox Code Playgroud)

  • @ tur1ng:它不需要一个. (24认同)
  • 这就是我不喜欢C(或C++)的原因.这究竟是怎么合法的?:-S (7认同)
  • main()没有回报;-) (3认同)

Ben*_*son 74

我一直试图找到一种从包含文件中窃取分号的"便携式"方式.这适用于Linux:

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

这导致一个typedef unsigned char uint8_t成为我的printf.

另一个有效的技巧是#define取消每个标准的stdint类型,这样就stdint.h减少了一堆分号.

这两个都落在FreeBSD上,因为它使用私有中间类型(例如__uint8_t),这意味着在引用的示例中删除typedef失败并阻止我在其他情况下成功删除所有非分号.

似乎应该可以从包含文件中干净地窃取分号.任何人都可以改善我的尝试吗?

  • +1是一种非常独特的方法......我喜欢它. (5认同)

Ben*_*son 41

我不知道是否建议这样做,因为它取决于问题的确切措辞,但是:

#error hello world
Run Code Online (Sandbox Code Playgroud)

(如果没有别的,也许它会避免后续"如何打印你好世界main"......)

  • 这种技术的主要问题是它实际上并没有产生可运行的程序.但是,它当然很聪明.一个聪明的解决方案永远不是一个坏的解决方案. (2认同)

Jer*_*myP 19

有可能编写一个C程序,它将打印"hello world"而不用IF/WHILE/FOR且不带分号.

简单.请注意,C区分大小写.

int main()
{
    if (printf("Hello, World\n")){}
}
Run Code Online (Sandbox Code Playgroud)

if是C中的关键字,IF不是.

  • @Dan Neely:什么是规则律师?老实说,最初的问题并不是一个严肃的编程问题,那么为什么人们会严肃认真地回答并严厉投票呢? (8认同)

ken*_*ytm 16

你也可以解决这个限制

#define X i##f
#define Y whi##le
#define Z f##or
#define W swi##tch
Run Code Online (Sandbox Code Playgroud)


ste*_*ert 15

关于什么:

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

不是C酷:)