📜  C C++程序无需使用main()和分号即可打印Hello World(1)

📅  最后修改于: 2023-12-03 14:59:36.440000             🧑  作者: Mango

C/C++程序无需使用main()和分号即可打印Hello World

简介

在C/C++编程中,我们通常会使用main()函数作为程序的入口,然后在函数体中写下程序代码。而C/C++程序可以不使用main()函数和分号,就能打印出Hello World

这似乎挑战了我们通常的编码习惯,也可能让初学者感到困惑。下面我们将介绍更多关于这种奇特的C/C++程序的详情。

程序代码
#include <stdio.h>

#define H World,
#define G Hello
#define F int

F main() {
    printf(G H);
}
#include <iostream>

#define H " World"
#define G "Hello "
#define F int

F main() {
    std::cout << G << H << std::endl;
}
分析

上述两个程序虽然使用了不同的编译器和语法,但实现的功能都是一样的——输出Hello World。下面我们来分析其中的奥秘。

宏定义

我们可以看到程序中都有类似#define的语句,它们实际上是宏定义。在C/C++中,宏定义允许程序员使用一个标识符来代替某个符号串,这个符号串可以是任何合法的语句或表达式。

在这两个程序中,我们定义了三个宏:

  • F:用来代替返回值类型,也就是int
  • G:用来代替字符串"Hello "
  • H:用来代替字符串" World"
逗号操作符

在第一个程序中,我们用到了逗号操作符,。逗号操作符的主要作用是将两个表达式链接起来,形成一个逗号表达式,返回逗号表达式中的最后一个值。

例如,表达式(1, 2, 3)的返回值为3,而表达式(a = 1, b = 2, c = 3)的返回值为3

在这个奇特程序中,我们用逗号操作符将World,(逗号)链接到一起,形成一个逗号表达式。最后返回的值是World。这个值被链接到了Hello后面,形成了字符串"Hello World"

#和##操作符

在这两个程序中,我们用到了宏定义中的#和##操作符。

  • #操作符可以将一个宏参数转化为字符串字面值。
  • ##操作符可以将两个宏参数合并成一个符号。

在这两个程序中,我们用到了这两个操作符,将HelloWorld合并成字符串"Hello World"

缺省返回值

在这两个程序中,我们没有在函数中显式地return任何值,但是程序却仍然能够正常运行。因为在C/C++中,当程序的入口函数main()不显式的return任何值时,会默认返回0

总结

虽然这种方法可以打印出Hello World,但并不推荐在实际编码中使用。这种方法不仅违背了程序设计的基本原则,也使得程序的可读性变得很差。我们应该遵循良好的编程习惯,编写具有可读性、可维护性和易于调试的代码。

不过,学习这种方法有利于我们更深入地理解C/C++的底层运作机制。所以,如果您对C/C++的底层原理有兴趣,可以尝试去理解这个奇特程序的实现方式。