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

How to print a 1 to N without using semicolon ? Explain this code

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

这个程序是如何工作的?。请解释一下

只要return里面的函数是一个可转换为bool的值,它也会被调用。

If successful, the total number of characters written is returned. On failure, a negative number is returned.

以上是 printf() 函数的 return 值。所以是的 printf("%d ", num) 在这种情况下总是 return true 并在每次迭代时打印。

这个糟糕示例中的代码依赖于一些脆弱的假设:

main 使用 2 个参数调用:一个 int 表示参数的数量,包括程序名称,以及一个 char* 的数组,其中包含以 [ 结尾的参数字符串=14=].

该示例假定使用单个 int 参数定义 main() 将生成与此调用约定兼容的代码,该代码可能有效也可能无效,并且被明确描述为具有未定义的行为C 标准 (J.2).

如果它是有效的或偶然起作用的,如果程序是从没有参数的命令行调用的,main 收到的 int 参数将是 1

main() 测试此参数是否为 <= N,换句话说,如果要打印该值。如果是这样,它调用 printf("%d ", num),它将 num 的十进制表示输出到 stdout 和 returns 产生的字符数,第一个数字为 2,非零,因此代码继续并递归调用 main,将下一个更高的数字传递给它。

一直持续到 N 以内的所有数字都已打印,并且最后一次递归调用中的第一个测试失败。

main 然后是 returns 0(如果编译器符合 C99 或更高版本的标准)。每次递归调用returns0直到对系统的初始调用returns0

代码很脆弱,因为 main 是以非标准方式调用的。这样写会稍微不那么难看:

#include <stdio.h>

#define N 10

int main(int argc, char *argv[]) {
    if (num <= N && printf("%d ", num) && main(num + 1, argv)) {}
}

但是请注意,递归调用 main() 通常被认为是不好的做法。