7

atoll関数でcにlonglong値を適切に設定するのに問題があります。これが私の例です:

#include <stdio.h>

int main(void) {
    char s[30] = { "115" };
    long long t = atoll(s);

    printf("Value is: %lld\n", t);

    return 0;
}

これは次のように出力します。値は:0

ただし、これは機能します。

printf("Value is: %lld\n", atoll(s));

ここで何が起こっているのですか?

4

1 に答える 1

12

まず、あなたの質問に答えましょう:

#include <stdio.h>
#include <stdlib.h>  // THIS IS WHAT YOU ARE MISSING


int main(void) {
    char s[30] = { "115" };
    long long t = atoll(s);

    printf("Value is: %lld\n", t);

    return 0;
}

それでは、「なぜ?」について話し合い、答えましょう。

非常に古い C プログラム (C89 より前) との互換性のために、最初に関数を宣言せずに関数を使用すると、エラーではなく、GCC からの警告のみが生成されます (ここの最初のコメントで指摘されているように、C89 では暗黙的な関数宣言も許可されています。したがって、エラーを生成することは適切ではありません。これが、警告のみが生成されるもう 1 つの理由です)。 ただし、そのような関数の戻り値の型はint(たとえば、で指定された型ではないstdlib.h)と見なされるatollため、プログラムは予期せず実行されますが、エラーは生成されません。でコンパイルすると、次の-Wallことがわかります。

警告: 関数の暗黙の宣言atoll

この事実は、期待値が返されない場合、atofを含めずに使用すると、ほとんどの人に衝撃を与えます。stdlib.hdouble

注:(質問のコメントの1つに対する回答としてatoll)これが、正しいヘッダーが含まれていない場合に結果が切り捨てられる可能性がある理由です。

于 2013-03-14T19:50:27.507 に答える