7

以下は、数値の桁を再帰的に加算することにより、特定の数値を1桁に減らすためのコードです。

たとえば、入力が845出力の場合は88+4+5 = 17 -> 1+7 = 8(出力)

#include <stdio.h>
#define TRUE 1

int reduceToSingle(int numb);

int main() 
{
    int numb;
    scanf("%d",&numb);
    printf("Original = %d Single digit = %d\n", numb, reduceToSingle(numb));

    return TRUE;
} 

int reduceToSingle(int numb)
{
    int sum = 0, digit = 0;
    for (digit = numb % 10; numb != 0; numb = numb / 10)
    {
        digit = numb % 10;
        sum += digit;
    }

    if (sum > 9)
        reduceToSingle(sum);
    else
        return sum;
}

if (sum > 9)上記のブロックのコードでは、関数値を返していません。代わりに関数を呼び出しました。論理的には、この関数は誤った値を与えるはずです。しかし、システムで上記のプログラムを実行すると、正しい桁数の合計が出力に表示されました。この振る舞いの背後にある論理を理解することはできません。

4

2 に答える 2

7

これは未定義の動作であり、警告が表示されると確信しています。たまたま動作します-コンパイラの設定を微調整するか、コンパイラを完全に変更すると、動作しなくなります。

この場合、私eaxは疑わしいので、期待値、つまり、returnいずれかの呼び出しによって最後に取得された値を取得します。したがって、を呼び出すと、最終的に(when )reduceToSingleに到達します。それ以降、の値は元の呼び出し元に少しずつ下がります。returnsum <= 9eax

于 2012-07-24T11:21:22.847 に答える
1

これは私が得たものです

815
Original = 815 Single digit = 2009291924

コード内のreduceToSingle(numb)はコード内の値を返さないため、次のようになります。

printf("%d %d",12);

したがって、他のフォーマット指定子のガベージ値が出力されます

于 2012-07-24T11:26:55.133 に答える