【问题标题】:How do you explain the discrepancy in the output of this piece of code?您如何解释这段代码的输出差异?
【发布时间】:2014-10-06 16:17:03
【问题描述】:

这段代码给出了意外的输出。当我注释 sumdig 函数的 printf 时,a 的返回值为 6,b 为 12,但保留 printf 时,a 为 5,b 为 6。请解释一下。

main()
{
    int a,b;
    a = sumdig(123);
    b = sumdig(123);
    printf("\na=%d b=%d",a,b);
    return 0;
}


int sumdig(int n)
{
    static int s=0;
    int d;
    if(n!=0)
    {
        d=n%10;
        n=(n-d)/10;
        s=s+d;
        sumdig(n);
    }
    else
        return s;
    printf("\n s=%d",s);
}

【问题讨论】:

  • 非空函数的每个路径都必须返回一个值。如果没有,我认为在 C 中,如果使用返回值,则只有 UB,但谁在乎呢?无论如何,你的编译器至少没有警告过你吗?
  • 在这里你到底怎么称呼意外?添加/删除printf的效果?还是没有printf,两个看似相同的调用返回不同的值?

标签: c


【解决方案1】:

如果您没有明确的 return 语句,则 int c 函数很容易返回最后一个调用的函数返回的任何值(尽管我相信实际行为是未定义的)。所以 当您要返回对 sumdig 的递归调用的值时,您正在返回 printf 的结果。

试试return sumdig(n);,而不是sumdig(n);

【讨论】:

    【解决方案2】:

    好吧,首先你应该在编译时使用尽可能多的警告,就像你的编译器会给你一样多的警告。

    这会告诉你,尽管sumdig 返回一个值,但至少有一个代码路径不返回任何内容,因此调用者会变得很垃圾。

    其次,您有一个永远不会重新初始化的静态变量,因此每个客户端调用都会在 s 中累积额外的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-18
      • 2021-04-24
      • 1970-01-01
      • 2020-11-13
      • 2013-08-24
      • 2015-07-31
      • 1970-01-01
      相关资源
      最近更新 更多