如何在不使用分号的情况下打印 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()
通常被认为是不好的做法。
// 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()
通常被认为是不好的做法。