5

Cでいくつかの基本的なデータ構造を実装していますが、関数からreturn型を省略してその関数を呼び出しても、コンパイラーはエラーを生成しないことがわかりました。でコンパイルしてcc file.c使用しませんでしたが-Wall(警告を見逃しました)、他のプログラミング言語ではこれは重大なエラーであり、プログラムはコンパイルされません。

Graham Borlandのリクエストによると、簡単な例を次に示します。

int test() 
{
  printf("Hi!");
}

int main() 
{ 
    test();
}
4

5 に答える 5

7

これは、Cでは、変数/関数が暗黙的にであるためintです。

registerこれは、の代わりにregister int、またはunsignedの代わりにunsigned int、のauto代わりにauto int、およびのstatic代わりに使用できるのと同じ理由ですstatic int。私は個人的に常に変数を明示的に修飾しますがint、そうするかどうかはあなたの選択です。

于 2012-06-01T23:08:20.523 に答える
7

Cは古い言語であり、導入された時点では、整数を返すことは、関数のデフォルトの戻り型になるほど一般的でした。後で人々は、より複雑な戻り型では、戻り型を忘れないようにintを指定するのが最善であることに気付き始めましたが、古いコードとの下位互換性を維持するために、Cはこのデフォルトの動作を削除できませんでした。代わりに、ほとんどのコンパイラは警告を発行します。

関数がreturnステートメントなしで終了に達すると、main関数を除いて未定義の値が返され、0が返されます。これには上記と同じ理由があります。

/* implicit declaration of printf as: int printf(int); */

/* implicit int type */
main()
{
    printf("hello, world\n");
} /* implicit return 0; */
于 2012-06-01T23:13:08.283 に答える
3

関数の戻り型はオプションであり、指定されていない場合は「int」と見なされます。

于 2012-06-01T23:08:18.583 に答える
3

これまでのところ、どの回答でもなぜうまく対処されているのかはわかりません。Cでは、呼び出し元が戻り値を使用しようとしない限り、void以外の戻り型を持つ関数がreturnステートメント/値なしで終了することは完全に合法です。たとえば(少し重要な例):

#include <stdio.h>
int foo(int want_result)
{
    puts("hello");
    if (want_result) return 42;
}

int main()
{
    foo(0);
    printf("%d\n", foo(1));
}

この例はやや工夫されていますが、returnタイプが巨大な構造であり、戻るのに取るに足らない時間がかかる場合は、実際に意味のあるものになる可能性があります。

于 2012-06-02T03:20:21.613 に答える
0

上記の答えが言うように、関数は0を返しません。実際、printfは値を返します:印刷された文字の数。この場合、テスト関数の最後の式であるprintfは3を返します。したがって、関数testは3を返します。

于 2012-06-01T23:19:15.737 に答える