2

私はSOの方法でここを読んだ:

C++ の場合:

  1. 非 void 関数から戻らないことは、未定義の動作です。
  2. ... analysis requires inspection of the entire program, which is incompatible with separate compilation, and which is not even possible in the general case ...

そのページのいくつかの回答から私が作成したことから、関数内の return ステートメントの存在を確認することは困難であり、実際には不可能な場合もあります。非 void 関数から返されないということは、C++ 標準によって未定義の動作のままでした。

しかし、Java ではコンパイル時に同じことがエラーとして報告されると聞きました。

Q. 私の理解は正しいですか?そして、Javaはどのように同じことを達成しますか?


編集:明確にするために、私は理解に興味があります:

  1. コンパイラに関連する実装の問題のために C++ 標準で未定義のままにされた場合、Java はどのようにして同じことを達成できるのでしょうか。

  2. そして、それがそれほど難しくないのであれば、C++ 標準はそれをエラーとして定義すべきではないでしょうか?

4

5 に答える 5

2

return私が知っているすべての C++ コンパイラは、非 void 関数からではないコード パスがある場合、エラーまたは警告を報告します。

コメンテーターが指摘するように、その逆は必ずしも真ではありません。コンパイラは、コードを正しく「理解」できないため、誤って警告を発行する場合があります。

于 2013-05-08T13:17:10.747 に答える
1

はい、あなたの理解は正しいです。Java がこれを行う方法は、常に値を返すメソッドに対しても厳格でエラーを発行することです。

次のメソッドがあるとします。すべてのケースがカバーされているため、常に値を返すことがわかっています。a はゼロより大きいか、ゼロ以下です。しかし、Java はこれを認識せず、リターンのある「if」、リターンのある「else if」、「else」がないためリターンがないため、エラーを報告します。

int foo( int a ) {
  if ( a > 0 ) {
    return -1;
  }
  else if ( a <= 0 ) {
    return 1;
  }
}

Java のコードを修正するには、else から if を削除する必要があります

int foo( int a ) {
  if ( a > 0 ) {
    return -1;
  }
  else /*if ( a <= 0 )*/ {
    return 1;
  }
}
于 2013-05-08T13:33:44.587 に答える