如何在不使用分号的情况下打印1到N?解释此代码

时间:2018-08-16 10:58:34

标签: c generic-programming

// 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))
    {
    }     
}

该程序如何工作?请解释一下

2 个答案:

答案 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并在每次迭代时打印。