Почему я получаю преобразование int в float неправильно в c ++? В какой-то момент в программе я явно конвертирую целое число со значением 10 или 14 в число с плавающей точкой, и получаю 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
Мне кажется, что-то незначительное, что я пропускаю.
Спасибо за помощь.
У вас есть два разных sum
переменные. sum
вы инициализируете в for
цикл на самом деле ограничен для цикла, так же, как i
счетчик. Когда вы делаете for (int i = 0, sum = 0; ...
вы создаете две новые переменные, i
а также sum
, для петли. Таким образом sum
переменная, которую вы обновляете в цикле for не sum
переменная, вы думаете, что это (это затенение sum
переменная, которую вы хотите).
Вот почему так важно с самого начала публиковать свой реальный, актуальный код. Такие мелочи очень важны.
Проблема в вашей программе связана с объемом вашей sum variable(s)
, Обратите внимание, что в своем нынешнем виде ваша программа имеет two instances of the sum variable
,
Один из sum
переменные внутри вашего цикла for.
for(int i=0, sum=0; i < n; i++)
{
sum = sum + elements[i];
}
Внутри для цикла он имеет local scope
Это означает, что переменная суммы существует только в течение цикла for. Вне цикла for его не существует!
Принимая во внимание, что в этой строке вашего кода cout << " float n is " << float(n) << " float sum is "<< float(sum) << endl;
переменная суммы, которую вы пытаетесь вывести, — это переменная, объявленная в начале вашей программы как int sum;
который также является second instance
из sum variable
и это не было инициализировано или присвоено значение.
Вот в чем твоя проблема.
Как компилятор может привести ваш int sum
в float sum
и вывести его на экран, когда ему не присвоено значение?
Программа отлично работает, как вы говорите для себя, когда sum
инициализируется вне цикла for. Это потому, что в этом случае sum
Используется переменная, объявленная вверху (после int n
). Эта версия sum
переменная имеет global scope
на протяжении всего тела кода, и когда вы выводите его в конце, компилятор распознает сумму как инициализированную для zero
и увеличивается внутри цикла for.
Таким образом, вывод представляет собой сумму всех чисел внутри массива elements[i]
,
Помните, что время жизни или область действия локальной переменной находится в пределах
процедура или блок кода, тогда как область действия глобальной переменной
во всей программе, то есть она распознается везде, где она используется
или ссылка.
Надеюсь это поможет!
Если вы делаете деление, целочисленное деление усекает. Вместо этого вы можете сначала сделать деление с использованием чисел с плавающей запятой, а затем отобразить с использованием целых чисел. Например, static_cast<float>(10/14)
не будет иметь никакого эффекта, потому что результат 10/14
является 0
и вы конвертируете 0
плавать, который до сих пор 0
, Если вы пытаетесь сохранить результат в int, он будет равен нулю из-за усечения.