2017-10-06 11 views
-1

私はこのエラーを受け取り続け、何かが戻ってこない理由を理解していません。私はいくつかのことを変えようとしましたが、何もしていないようです。私はプログラムにユーザーに0を返すように言ったが、何らかの理由でこれはまだ問題である。どんな助けでも大歓迎です。ありがとう!なぜ私は取得し続けるのですか?警告:制御は非void関数の終わりに達します[-Wreturn-type]

コード:

#include <iostream> 
using namespace std; 

char grade(int x) 
{ 
    if (x >= 90) { 
     return 'A'; 
    } 
    if (x >= 80) { 
     return 'B'; 
    } 
    if (x >= 70) { 
     return 'C'; 
    } 
    if (x >= 60) { 
     return 'D'; 
    } 
    if (x >= 0) { 
     return 'F'; 
    } 
} 
int main(void) 
{ 
    int s_grade; // student grade 
    cout << "What is the score: "; 
    cin >> s_grade; 
    cout <<"A score of " << s_grade << " is equal to a grade of " << 
     grade(s_grade) << endl; 

    return 0; 

} 
+1

['using namespace std;'は悪い習慣です(https://stackoverflow.com/q/1452721/2176813)、絶対に使用しないでください。さらに、C++では、関数が引数を持たない場合(普通はより無作為と見なされない場合)、引数リストに 'void'を入れる必要はありません – tambre

+5

' x'が0より小さい場合、 'grade'は何を返しますか? ? – 1201ProgramAlarm

+1

'if'のどれも実行していない場合は何も返しません – user463035818

答えて

1

それがcharを返します主張したが、最後の後に、それは何のreturn文を持っていない場合char grade(int x)あなたの機能。たとえば、i = -1の場合、何も返されません。

3
char grade(int x) { 
    if (x >= 90) { 
     return 'A'; 
    } 
    if (x >= 80) { 
     return 'B'; 
    } 
    if (x >= 70) { 
     return 'C'; 
    } 
    if (x >= 60) { 
     return 'D'; 
    } 
    if (x >= 0) { 
     return 'F'; 
    } 
} 

xが0より小さい場合、この関数はreturn文にヒットしません。 C++では、これは未定義の動作です(しかし、あなたが観察したように、コンパイラが警告を発することができます)。

一つの解決策は、これを行うことです:。

char grade(int x) { 
    if (x >= 90) { 
     return 'A'; 
    } 
    if (x >= 80) { 
     return 'B'; 
    } 
    if (x >= 70) { 
     return 'C'; 
    } 
    if (x >= 60) { 
     return 'D'; 
    } 
    if (x >= 0) { 
     return 'F'; 
    } 
    return 'X'; 
} 

をそして、あなたのコードは、渡される無効なグレードの結果、無効な応答として'x'を解釈することができ

+0

ありがとう!すべてが今働いている! – Josh

0

それはあなたの関数かのように見えます値を返すように定義したchar grade(int x)は、状況によってはそうすることができません。コンパイラは、実行可能なパスがないことを確認して、値を指定せずに関数を返すようにします。あなたがプログラマとして - これが起こらないことを知っているかどうかは本当に問題ではありません。

xの値がすべて返されるようにするか、pragmaなどの値を使用してコンパイラのチェックを緩和する必要があります。

0

この警告は、「値なしの戻り値」で説明した警告に似ています。制御が関数の終わりに達し、戻り値が見つからない場合、GCCは戻り値のない戻り値を取る。ただし、このためには関数に戻り値が必要です。関数の最後に、コントロールが決してそこに到達しない場合でも、適切な戻り値を返すreturnステートメントを追加します。

https://www.ibm.com/support/knowledgecenter/en/SSB23S_1.1.0.14/common/m1rhnvf.html

char grade(int x) { 
    if (x >= 90) { 
     return 'A'; 
    } 
    if (x >= 80) { 
     return 'B'; 
    } 
    if (x >= 70) { 
     return 'C'; 
    } 
    if (x >= 60) { 
     return 'D'; 
    } 

    return 'F'; 
} 
2

警告の理由は、パラメータの間違った種類を使用しています。:)

あなたはタイプintを持つものとしてパラメータを宣言しました。これは、範囲

[INT_MIN, INT_MAX] 

のヘッダ<climits>を使用する場合

[std::numeric_limits<int>::min(), std::numeric_limits<int>::max()] 

に又は機能のみが非分析しかしパラメータが範囲だけでなく、非負の値も負の値を受け入れることができることを意味します負の値。負の値が関数に渡される場合は警告が言うように

コントロールが非void型関数の終わり

達するのでそれでは関数が未定義の動作をしている

char grade(int x) 
{ 
    if (x >= 90) { 
     return 'A'; 
    } 
    if (x >= 80) { 
     return 'B'; 
    } 
    if (x >= 70) { 
     return 'C'; 
    } 
    if (x >= 60) { 
     return 'D'; 
    } 
    if (x >= 0) { 
     return 'F'; 
    } 
} 

コンパイラは、関数に渡される引数の値を知ることができません。

したがって、このパラメータは、タイプがunsigned intであると宣言する必要があります。

この場合、関数は

char grade(unsigned int x) 
{ 
    if (x >= 90) { 
     return 'A'; 
    } 
    if (x >= 80) { 
     return 'B'; 
    } 
    if (x >= 70) { 
     return 'C'; 
    } 
    if (x >= 60) { 
     return 'D'; 
    } 
    if (x >= 0) { 
     return 'F'; 
    } 
} 

または、次のよう

char grade(unsigned int x) 
{ 
    if (x >= 90) { 
     return 'A'; 
    } 
    else if (x >= 80) { 
     return 'B'; 
    } 
    else if (x >= 70) { 
     return 'C'; 
    } 
    else if (x >= 60) { 
     return 'D'; 
    } 
    else /* x >= 0 */{ 
     return 'F'; 
    } 
} 

のように見えることができますし、メインに変数s_gradeもすることができます

unsigned int s_grade; 
0

のように宣言する必要があります最後のif文をelseに変更すると、うまく動作するはずです。負の値をチェック

else return 'F'; 代わりに

if (x >= 0) { return 'F'; }

メイン自体で処理することができます。

関連する問題