область действия — явное приведение типов c ++ дает неправильный ответ

Почему я получаю преобразование 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

Мне кажется, что-то незначительное, что я пропускаю.

Спасибо за помощь.

0

Решение

У вас есть два разных sum переменные. sum вы инициализируете в for цикл на самом деле ограничен для цикла, так же, как i счетчик. Когда вы делаете for (int i = 0, sum = 0; ... вы создаете две новые переменные, i а также sum, для петли. Таким образом sum переменная, которую вы обновляете в цикле for не sum переменная, вы думаете, что это (это затенение sum переменная, которую вы хотите).

Вот почему так важно с самого начала публиковать свой реальный, актуальный код. Такие мелочи очень важны.

1

Другие решения

Проблема в вашей программе связана с объемом вашей 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],

Помните, что время жизни или область действия локальной переменной находится в пределах
процедура или блок кода, тогда как область действия глобальной переменной
во всей программе, то есть она распознается везде, где она используется
или ссылка.

Надеюсь это поможет!

1

Если вы делаете деление, целочисленное деление усекает. Вместо этого вы можете сначала сделать деление с использованием чисел с плавающей запятой, а затем отобразить с использованием целых чисел. Например, static_cast<float>(10/14) не будет иметь никакого эффекта, потому что результат 10/14 является 0и вы конвертируете 0 плавать, который до сих пор 0, Если вы пытаетесь сохранить результат в int, он будет равен нулю из-за усечения.

0
По вопросам рекламы [email protected]