【问题标题】:Output of following program以下程序的输出
【发布时间】:2014-01-16 01:42:45
【问题描述】:
#include <stdio.h>

int main(int k)
{
    if(k<10)
            printf("%d ",main(k+1));
    return k;
}

输出是:

10 9 8 7 6 5 4 3 2

main() 函数的参数中,它的argc 但在这里如何使用?

【问题讨论】:

  • 你的编译器/环境是什么,不是标准的 main 签名,除非你的实现明确允许它。
  • 哦..对不起..我忘了说..它的 GCC
  • 传递给程序代码的参数数量将决定 k 的初始值。在不传递任何参数的情况下,k 的初始值为 1。对 main 的递归调用不会像 O/S 将参数传递给 main 那样使用 main。它调用自己就像任何常规函数一样,它传递一个 k+1 的 int 参数。递归作为 printf 的参数发生,因此 printf 将等待对 main 的调用返回,然后才能打印。结果是反向打印顺序。

标签: c main argc


【解决方案1】:

首先,您的main 签名是标准定义的。你的编译器应该给出警告:

[Warning] 'main' takes only zero or two arguments [-Wmain]  

C11: 5.1.2.2.1 程序启动:

程序启动时调用的函数名为main。实现声明没有 这个函数的原型。它应使用int 的返回类型定义,并且没有 参数:

int main(void) { /* ... */ }

或带有两个参数(此处称为argcargv尽管可以是任何名称 使用1,因为它们在声明它们的函数中是本地的):

int main(int argc, char *argv[]) { /* ... */ }

或等价物;10) 或以其他一些实现定义的方式。

现在,你可以给argcargv起任何名字。这里argck。由于您没有将参数传递给main,因此k 的值是1,因为这里argv[0] 是程序的名称。现在k=1被程序用作初始值和值

10 9 8 7 6 5 4 3 2 

通过main的递归调用打印。


1。重点是我的。

【讨论】:

  • +1 未传递参数的程序将具有 argv[0] == 程序名称和 argc == 1,在代码中重命名为 k。
  • 您做出了一个可能但可能不正确的假设,即实施没有将该签名定义为有效。
  • @ShafikYaghmour;我引用了标准的说法和编译器的警告。
  • 上面还写着or in some other implementation-defined manner.
  • @muradin 你必须为官方标准付费,但草案是免费提供的。
【解决方案2】:

您已将 main 函数用作递归函数,因此当您使用参数 1 调用它时,它将堆栈 main 函数,而 k 达到 10 的值,然后它将堆栈出列并按相反顺序打印值。你通过 ,2,3,..10 并且在堆栈出队后它将打印 10,9,..2

【讨论】:

  • 其实当程序代码不带任何参数被调用时,k会是1,因为arrgv[0]是程序的名字,所以k(即argc)是1。你传递的参数越多对于程序来说,k 值越高,打印的数字就越少。如果您传递的参数为 1,则此代码中的 argc == 2 或 k。
猜你喜欢
  • 2018-01-23
  • 1970-01-01
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 2017-06-17
  • 2015-12-07
  • 1970-01-01
相关资源
最近更新 更多