C语言中的hello world不带分号,也不带IF/WHILE/FOR语句

C语言中的hello world不带分号,也不带IF/WHILE/FOR语句,c,puzzle,C,Puzzle,我的朋友说,可以编写一个C程序来打印“hello world”,不带IF/WHILE/FOR,也不带分号。经过最少的研究,我告诉她这是不可能的。可能吗?#包括 #include <stdio.h> int main() { switch (printf("Hello, world!\n")) {} } int main(){ 开关(printf(“你好,世界!\n”){} } 如果您的朋友说“哦,您也不能使用开关”,那么: #包括 intmain(intargc,cha

我的朋友说,可以编写一个C程序来打印“hello world”,不带
IF/WHILE/FOR
,也不带分号。经过最少的研究,我告诉她这是不可能的。可能吗?

#包括
#include <stdio.h>

int main() {
    switch (printf("Hello, world!\n")) {}
}
int main(){ 开关(printf(“你好,世界!\n”){} }
如果您的朋友说“哦,您也不能使用开关”,那么:

#包括
intmain(intargc,char*argv[printf(“你好,世界!\n”)]){}

我对是否提出这一建议感到困惑,因为这取决于问题的确切措辞,但:

#error hello world

(如果没有其他内容,也许它可以避免后续的“如果没有
main
,如何打印hello world”…)

您还可以绕过以下限制:

#define X i##f
#define Y whi##le
#define Z f##or
#define W swi##tch
那么:

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

不是很酷:)

我一直在试图找到一种“可移植”的方法,从包含文件中窃取分号。这在Linux下工作:

int main(int ac, char **av)
{
#define typedef
#define uint8_t a[printf("hello world\n")]
#include <stdint.h>
}
int main(int ac,char**av)
{
#定义typedef
#定义uint8\u t a[printf(“hello world\n”)]
#包括
}
这会导致一个
typedef无符号字符uint8\t
成为我的printf

另一个有效的技巧是
#定义
每一个标准stdint类型,使
stdint.h
减少为一组分号

这两种类型在FreeBSD上都没有什么区别,因为它使用私有中间类型(如
\uuuint8\u t
),这意味着在引用的示例中删除typedef失败,在另一种情况下无法成功删除所有非分号

似乎可以从include文件中完全窃取分号。有人能改进我的尝试吗

可以编写一个C程序来打印“hello world”,不带IF/WHILE/FOR和分号

简单。注意C是区分大小写的

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

如果
是C中的关键字,
如果
不是。

您可以使用switch语句获得所需的输出,下面是代码

#include<stdio.h>

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

return 0;
}
#包括
int main()
{
开关(printf(“hello world”))
返回0;
}


希望这能帮助你

相关:你为什么要这么做?如果你的键盘缺少一个分号,你会有更深层次的问题。听起来你的朋友喜欢那些模糊的C和PERL竞赛?@John:出于同样的原因,人们会为模糊的C竞赛写条目,或者写PERL诗歌,或者玩数独。如果你缺少一个键,你可以
cat
一些随机的C文件,然后剪切粘贴
.main()没有返回;-)@tur1ng:它不需要。@iam:.+1,尽管您在
argv
之前忘记了
*
。这是为什么呢?这就是为什么我不喜欢C(或者C++)的原因。这到底是怎么合法的-请不要对自己太苛刻这种技术的主要问题是它实际上不会产生一个可运行的程序。然而,它确实很聪明。聪明的解决方案从来都不是坏的解决方案。@cdh但你的意思是说“我仍然是国王”哈哈,不。我也把这个投了更高的票不适用于所有平台,但是<代码>#pragma消息(“helloworld!”)另外,它将创建一个可运行的程序。只是程序不会做任何事情:)。+1用于非常独特的方法。。。我喜欢它。不适用于Windows(Microsoft C编译器版本17)#包括它包含许多semicolons@orionll在Winodws中工作!但是在MingW4.4:-PWhy的否决票?我遵照信中的要求,就问题本身而言。当问题本身是一个无用的“我们如何才能合法地滥用C”问题时,这似乎有点刺耳。@JeremyP我没有投其他的票,但没有人喜欢规则律师。@Dan Neely:什么是规则律师?老实说,最初的问题并不是一个严肃的编程问题,那么为什么人们会严肃地对待一个开玩笑的答案并投反对票呢?@jere请参考我之前的评论if/WHILE/FOR are language structs,不是关键字。您能解释一下在另一个函数参数声明块中插入函数调用的合法性吗?我几乎不能理解。我真的很想知道…:-)printf返回一个int(在本例中也是一个可预测的int),这意味着函数的完整定义是int main(void*HAHA[12]){}为了确定幻数是12,必须首先执行printf语句。不起作用:错误C2057:预期的常量表达式(Microsoft C/C++编译器17)@ZhekaKozlov:你需要一个合适的C99编译器。
#include<stdio.h>

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

return 0;
}