以下程序的输出应该是什么?

时间:2017-04-25 07:01:39

标签: c output

void foo(int n, int sum)
{

  int k = 0, j = 0;

  if (n == 0) return;

  k = n % 10;

  j = n / 10;

  sum = sum + k;

  foo (j, sum);

  printf ("%d,", k);

}

int main ()

{

  int a = 2048, sum = 0;

  foo (a, sum);

  printf ("%d\n", sum);

  getchar();

}

对我而言,这应该是4,0,2,8,0 但是,当我执行它时,它给了我2,0,4,8,0

3 个答案:

答案 0 :(得分:1)

如代码所示,参数sumfoo并不真正相关,因为它是按值传递的,因此主函数printf ("%d\n", sum)中的最后一个语句将打印{{1}无论0内发生了什么。这是您在程序生成的输出中看到的最后一个foo

现在,函数0本身接受参数foo,执行整数除以10,并递归调用自身,直到n为零。这实际上意味着它将打印输入数字的十进制数字,这是您在输出中看到的...

答案 1 :(得分:0)

它被称为对函数的递归调用。

内部递归以 ExtendedPropertyDefinition PR_Folder_Path = new ExtendedPropertyDefinition(26293, MapiPropertyType.String); PropertySet psPropSet = new PropertySet(BasePropertySet.FirstClassProperties); psPropSet.Add(PR_Folder_Path); FolderId rfRootFolderid = new FolderId(WellKnownFolderName.Root, mbMailboxname); FolderView fvFolderView = new FolderView(1000); fvFolderView.Traversal = FolderTraversal.Deep; fvFolderView.PropertySet = psPropSet; SearchFilter sfSearchFilter = new SearchFilter.IsEqualTo(FolderSchema.FolderClass, "IPF.Appointment"); FindFoldersResults ffoldres = service.FindFolders(rfRootFolderid, sfSearchFilter, fvFolderView); if (ffoldres.Folders.Count > 0) { foreach (Folder fld in ffoldres.Folders) { Console.WriteLine(fld.Id.ToString() + " " + fld.DisplayName); } } LAST IN FIRST OUT类型

运行

现在,在您的情况下,它首先打印上次调用stack函数

的输出

执行程序的步骤是这样的,结果将进入堆栈

1 - 1次调用foo foo

k = 8

2 - 第2次调用[{1}}

foo

3 - 3次呼叫k = 4 foo

k = 0

第4 - 4次调用foo <{1}}

k = 2

如前所述,它将像堆栈一样工作,因此程序的输出将是 2 0 4 8如果您希望将4,0,2,8,0作为输出,则需要相应地编写逻辑:)

答案 2 :(得分:0)

是的,你得到的输出是完全正确的。

main()中,使用foo()a=2048调用sum=0

foo()我们有n=2048,if条件会计算k的值,即(n%10)和j,即({ {1}})直到n/10等于n

现在,由于0foo()j为参数进行递归调用,因此每次迭代中sum的值被推送到堆栈并弹出在满足k条件时退出。

因此,如果你追踪程序,你得到n==0的值,它被推送到相同的序列堆叠,因此在弹出元素时我们有k=8,4,0,2