0

c++ で int から float への変換が間違っているのはなぜですか? プログラムのある時点で、値が 10 または 14 の整数を float に明示的に変換すると、0 になります。なぜでしょうか? static_cast を試してみましたが、同じ結果が得られました。int と float の両方が 4 バイトであるため、int から float への変換はサイズによる降格または昇格ではないと考えていますか? 丸め誤差などに関連していますか?誰か説明してくれませんか。

これがコードです(ここには変更があり、正常に機能しますが、理由はまだわかりません)---

#include <iostream>
using namespace std;

int main()
{

int n;
int sum;

cout << "Please enter the number:";
cin >> n;

int *elements = new int[n];

cout << "Please enter the elements:";
for(int i=0; i<n; i++)
{
   cin >> elements[i];
}
cout << endl;

///// this approach, gives the sum right, but float(sum) fails and always gives zero.

for(int i=0, sum=0; i < n; i++)
{
   sum = sum + elements[i];
}

////// This works, when sum is initialised outside of for loop. float(sum) does the right conversion as well.
//sum = 0;
//for(int i=0; i < n; i++)
//{
//   sum = sum + elements[i];
//}

cout << " float n is " << float(n) << " float sum is "<< float(sum) << endl;
// float(sum) is zero, when sum is initialised from within for loop.

delete[] elements;

return 0;
}

コンパイルするコマンド -> g++ 3.2.cpp -o 3.2

入力: n = 4; 要素 = 1 2 3 4

私が見落としているのは些細なことのように感じます。

助けてくれてありがとう。

4

3 に答える 3

1

あなたのプログラムの問題は、あなたのsum variable(s). 現在の形式では、プログラムには があることに注意してくださいtwo instances of the sum variable

sum変数の 1 つがfor ループ内にあります。

for(int i=0, sum=0; i < n; i++) { sum = sum + elements[i]; }

for ループ内には があります。これはlocal scope、合計変数が for ループの間だけ存在することを意味します。for ループの外では存在しません。

一方、コードcout << " float n is " << float(n) << " float sum is "<< float(sum) << endl;のこの行では、出力しようとしている合計変数は、プログラムの先頭で宣言されているものでint sum;あり、second instance初期化も割り当てもされていませsum variableん。これがあなたの問題です。値が割り当てられていない場合、コンパイラはどのようにあなたをにキャストして画面に出力できますか?int sumfloat sum

sumforループの外で初期化されたとき、あなたが自分で言うように、プログラムはうまく動作します。これは、この場合、sum使用される変数が先頭 ( の後int n) で宣言されたものであるためです。このバージョンのsum変数には、global scopeコード本体全体の期間中の for があり、最後にそれを出力すると、コンパイラzeroは for ループ内で初期化およびインクリメントされた合計を認識します。

したがって、出力は配列内のすべての数値の合計ですelements[i]

ローカル変数の有効期間またはスコープはプロシージャまたはコード ブロック内にあるのに対し、グローバル変数のスコープはプログラム全体にあることに注意してください。つまり、使用または参照される場所はどこでも認識されます。

お役に立てれば!

于 2014-03-07T10:20:06.130 に答える
1

2 つの異なるsum変数があります。sumループで初期化しているのは、カウンターforと同様に、実際には for ループにスコープされます。iこれを行うと、ループ用にfor (int i = 0, sum = 0; ...2 つの新しい変数 と が作成されます。したがって、for ループで更新している変数は、あなたが思っている変数ではありません (必要な変数を隠しています)。isumsumsumsum

これが、実際の実際のコードを最初から投稿することが重要である理由です。このような小さな詳細は非常に重要です。

于 2014-03-07T08:45:55.050 に答える
0

除算を行っている場合、整数除算は切り捨てられます。代わりにできることは、最初に float を使用して除算を行い、次に int を使用して表示することです。たとえば、 の結果が であり、まだ である float に変換しているstatic_cast<float>(10/14)ため、 は効果がありません。結果を int に格納しようとすると、切り捨てのためにゼロになります。10/14000

于 2014-03-07T06:48:35.183 に答える