// A recursive C program to print all numbers from 1
// to N without semicoolon
#include<stdio.h>
#define N 10
int main(int num)
{
if (num <= N && printf("%d ", num) && main(num + 1))
{
}
}
该程序如何工作?请解释一下
答案 0 :(得分:1)
这个糟糕的示例中的代码依赖于一些脆弱的假设:
main
用2个参数调用:int
代表参数数目,包括程序名,以及char*
的数组,其中包含以{{1 }}。
该示例假定使用单个NULL
参数定义main()
将产生与该调用约定兼容的代码,该调用约定可能有效也可能无效,并且被C标准明确描述为具有未定义的行为(J.2)。
如果它是有效的或偶然地起作用,那么如果从命令行中不带参数地调用程序,则int
接收到的int
参数将是main
。
1
测试此参数是否为main()
,换句话说,如果要打印该值。如果是这样,它将调用<= N
,后者将printf("%d ", num)
的十进制表示形式输出到num
,并返回产生的字符数,第一个数字为2,非零,因此代码继续并递归调用stdout
,将下一个更大的数字传递给它。
一直进行到打印出所有main
为止的数字,并且最后一次递归调用中的第一个测试失败。
N
然后返回main
(如果编译器符合C99或更高版本的标准)。每个递归调用都会返回0
,直到初始调用将0
返回系统为止。
该代码易碎,因为以非标准方式调用0
。这样写起来会不那么难看:
main
但是请注意,递归调用#include <stdio.h>
#define N 10
int main(int argc, char *argv[]) {
if (num <= N && printf("%d ", num) && main(num + 1, argv)) {}
}
通常被认为是不好的做法。
答案 1 :(得分:0)
只要内部函数返回一个可转换为bool的值,它就会被接受也称为。
如果成功,则返回写入的字符总数。失败时,将返回负数。
上面是printf()函数的返回值。因此,printf("%d ", num)
在这种情况下将始终返回true并在每次迭代时打印。