Print 1 to 1000 with out using loop的后续问题--今天提出的问题,是对旧问题的重复,显示了主函数递归的代码片段:
此代码意味着在不使用任何循环的情况下计数到10,它通过递归在主函数指针上进行计数,并且当达到所需的打印量时,它将指针更改为exit函数。
#include <stdio.h>
#include <stdlib.h>
void main(int j) {
printf("%d\n", j);
(&main + (&exit - &main)*(j/10))(j+1);
}注意,我更改了该值将被打印的次数,我确实理解函数指针的减法是UB,但我仍然用以下方式编译和运行这个函数:
./mainexit 547出于某种原因,打印出来的值是从2到10。当我用./mainexit 1启动程序时,它会打印到j达到10,然后引用将用于退出,但是当我从一开始运行程序时,递归中的第一个函数被调用到地址57*&exit,所以它应该会做非常奇怪的事情,但是它会正常地打印。对于函数如何返回主函数,有什么想法吗?
发布于 2014-11-04 16:27:32
参数j不是以您认为的方式使用的。
启动命令时,main的第一个参数是命令行的arg数。因此,使用./mainexit 547启动只是传递2作为第一次调用main的第一个值。然后构建循环,以便在j达到10时调用exit。
因此,您的arg的值是没有用的,尝试./mainexit hello,它会给您相同的结果!
发布于 2014-11-04 17:52:09
你可以这样胡说八道
/* 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
并得到:
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
并得到:
argc=7
argc=8
argc=9
argc=10但当然,如果你只做这样的事情会好得多:
/* 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;
}现在你输入:
$ ./reccount.x
to=1
to=2
to=3
to=4
to=5
to=6
to=7
to=8
to=9
to=10或者,您可以将限制设置为:
$ ./reccount.x 2
to=1
to=2现在,回到你的问题:
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),您可以通过在代码的开头添加这样的条件来完成这个任务:
if(argc==2 && argv!=NULL)
j=atoi(argv[1]);
else
j=argc;然后称他们为:
(&main + (&exit - &main)*(j/10))(j+1, NULL);
示例:
#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。
https://stackoverflow.com/questions/26739950
复制相似问题