首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用循环刀边从1计数到1000

不使用循环刀边从1计数到1000
EN

Stack Overflow用户
提问于 2014-11-04 16:18:24
回答 2查看 145关注 0票数 1

Print 1 to 1000 with out using loop的后续问题--今天提出的问题,是对旧问题的重复,显示了主函数递归的代码片段:

此代码意味着在不使用任何循环的情况下计数到10,它通过递归在主函数指针上进行计数,并且当达到所需的打印量时,它将指针更改为exit函数。

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

void main(int j) {
  printf("%d\n", j);
  (&main + (&exit - &main)*(j/10))(j+1);
}

注意,我更改了该值将被打印的次数,我确实理解函数指针的减法是UB,但我仍然用以下方式编译和运行这个函数:

代码语言:javascript
复制
./mainexit 547

出于某种原因,打印出来的值是从2到10。当我用./mainexit 1启动程序时,它会打印到j达到10,然后引用将用于退出,但是当我从一开始运行程序时,递归中的第一个函数被调用到地址57*&exit,所以它应该会做非常奇怪的事情,但是它会正常地打印。对于函数如何返回主函数,有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-04 16:27:32

参数j不是以您认为的方式使用的。

启动命令时,main的第一个参数是命令行的arg数。因此,使用./mainexit 547启动只是传递2作为第一次调用main的第一个值。然后构建循环,以便在j达到10时调用exit。

因此,您的arg的值是没有用的,尝试./mainexit hello,它会给您相同的结果!

票数 3
EN

Stack Overflow用户

发布于 2014-11-04 17:52:09

你可以这样胡说八道

代码语言:javascript
复制
/* Count from 1 to 10 using recursive main call */

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int r;
  if(argc>=11)
    return EXIT_SUCCESS;

  printf("argc=%d\n", argc);
  r = main(argc+1, NULL);
  return r;
}

你可以打电话给

$./countmain

并得到:

代码语言:javascript
复制
argc=1
argc=2
argc=3
argc=4
argc=5
argc=6
argc=7
argc=8
argc=9
argc=10

或呼叫

$./countmain a b c d 4 4

并得到:

代码语言:javascript
复制
argc=7
argc=8
argc=9
argc=10

但当然,如果你只做这样的事情会好得多:

代码语言:javascript
复制
/* Count from 1 to 10 using recursive function call */

#include <stdio.h>
#include <stdlib.h>

void reccount(int to);

int main(int argc, char *argv[])
{
  int to;
  if(argc==2)
    to=atoi(argv[1]);
  else
    to=10;

  reccount(to);

  return EXIT_SUCCESS;
}

void reccount(int to)
{
  if(to==0)
    return;

  reccount(to-1);
  printf("to=%d\n", to);
  return;
}

现在你输入:

代码语言:javascript
复制
$ ./reccount.x
to=1
to=2
to=3
to=4
to=5
to=6
to=7
to=8
to=9
to=10

或者,您可以将限制设置为:

代码语言:javascript
复制
$ ./reccount.x 2
to=1
to=2

现在,回到你的问题:

代码语言:javascript
复制
warning: ‘main’ takes only zero or two arguments [-Wmain]
warning: return type of ‘main’ is not ‘int’ [-Wmain]

如果exit有一个类似于main的原型,即int exit(int x, char **y),您可以通过在代码的开头添加这样的条件来完成这个任务:

代码语言:javascript
复制
if(argc==2 && argv!=NULL)
  j=atoi(argv[1]);
else
  j=argc;

然后称他们为:

(&main + (&exit - &main)*(j/10))(j+1, NULL);

示例:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

int myexit(int j, char **p)
{
  exit(j);
}

int main(int argc, char **argv)
{
  int j;
  if(argc==2 && argv!=NULL)
    j=atoi(argv[1]);
  else
    j=argc;
  printf("%d\n", j);
  (&main + (&myexit - &main)*(j/10))(j+1, NULL);
}

但就目前情况而言,您只是无法从命令行正确地阅读argv。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26739950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档