2017-01-06 14 views
-4
#include <iostream> 
#include <iomanip> 

using namespace std; 

int main() 
{ 
     float a; 

     float b; 
     float avg; 

     avg = ((3.5 * a) + (7.5 * b))/(3.5 + 7.5); 

     cout <<"AVG = "; 
     std::cout << std::fixed << std::setprecision(5) << avg << endl; 


     return 0; 
} 
+4

未定義の振舞い – Danh

+2

答えはすでにubであると説明しています。しかし、どんなアウトプットを期待しましたか? –

答えて

1

したがって、これは基本的にコンパイラ固有のものです。あなたのコンパイラは、変数aとbを0に初期化しているようです。関数mainでaとbが初期化されていないというコードをコンパイルする際に、警告が表示されるのが理想です。あなたが別のコンパイラを試してみたら、それを0に割り当てることはできませんが、残っている値は何でも得なければなりません。

3

そのあなたが変数任意の値を持つBを初期化していないので、0.00000を与えます。 はあなたのコンパイラは、初期化されていないローカル変数を使用して

+1

「コンパイラは 'a'と' b'を '0'で初期化しています」というのは、これらの特定のオプションを持つこのコンパイラに固有のことです。ここで観察される行動は、いかなる基準によっても規定されていない – Garf365

5

Bを初期化していることがあり未定義の動作(UB)を示しており、未定義の動作に何の適切な説明はありません。

3

タイプfloatグローバル変数は、コンパイラによってゼロに初期化されているので、次のコードは間違いなく0

#include <iostream> 
#include <iomanip> 

using namespace std; 

float a; 
float b; 
float avg; 

int main() 
{ 
    avg = ((3.5 * a) + (7.5 * b))/(3.5 + 7.5); 

    cout << "AVG = "; 
    std::cout << std::fixed << std::setprecision(5) << avg << endl; 

    return 0; 
} 

を生成します。

しかし、コンパイラが変数ローカル変数の変数を初期化してはならないため、操作前に変数が初期化されていないため、元のスニペットが正しくありません。規格は、 "未定義の動作"、およびいくつかのコンパイラが見つけることを呼び出し、エラーとして(例えばVisual StudioのC++コンパイラ):

エラー2エラーC4700:初期化されていないローカル変数 '' 使用source.cpp 15

エラー3エラーC4700:初期化されていないローカル変数 'B' 使用source.cpp 15

変数が初期化されていないので、15行目は、avg = ((3.5 * a) + (7.5 * b))/(3.5 + 7.5);

0

その0です。その後、未定義の動作が発生します。

未定義の動作がわからない場合は、それを要約すると、正常に構築されますが、実行可能ファイルは実行されません。

関連する問題