C : почему я должен заказывать свое объявление как double таким образом?

#c #initialization #expression #control-flow

#c #инициализация #выражение #поток управления

Вопрос:

итак, одним из моих заданий было создание программы, которая конвертирует валюты, эта ниже конвертирует доллары США в определенные южноамериканские доллары.

Я не уверен, почему я не могу объявить переменную для долларов США вместе с переменной для других валют. Я сделал это таким образом, и программа испортила преобразование:

 double dollars;

double pesos = dollars * 26;

double reais = dollars * 5.9;

double soles = dollars * 3.53;

std::cout << "Enter the number of U.S. dollars you have:";
std::cin >> dollars;

std::cout << "In colombian pesos, that's " << pesos << "n";
std::cout << "In brazilean reals, that's " << reais << "n";
std::cout << "In peruvian soles, that's " << soles << "n";
  

ввод / вывод был таким:

 Enter the number of U.S. dollars you have:1
In colombian pesos, that's 0
In brazilean reals, that's 0
In peruvian soles, that's 0
  

Однако, когда я запускаю код таким образом (вводя ввод непосредственно после объявления dollars ), ввод выполняет правильное преобразование:

 double dollars;

std::cout << "Enter the number of U.S. dollars you have:";
std::cin >> dollars;

double pesos = dollars * 26;

double reais = dollars * 5.9;

double soles = dollars * 3.53;

std::cout << "In colombian pesos, that's " << pesos << "n";
std::cout << "In brazilean reals, that's " << reais << "n";
std::cout << "In peruvian soles, that's " << soles << "n";
  

Я не думал, что место, где я размещаю объявление переменной, имеет значение, если я объявил его перед его использованием.

Комментарии:

1. Вы должны ввести dollars , прежде чем сможете вычислить pesos из него и т.д.

2. Двигайтесь std::cin >> dollars; вверх, прямо перед замедлением других валют. Просто заметил, что вы это уже поняли. Это потому dollars , что оно неинициализировано, с неизвестным значением в нем.

3. Этот код должен вызвать предупреждение от компилятора . Пожалуйста, настройте свои предупреждения компилятора, чтобы это произошло.

4. Это потому, что оператор в c не является математическим отношением, это одноразовое вычисление. В вашем первом примере вы вычисляете значение pesos , reais и soles перед тем, как вы попросили dollars использовать любой мусор, который был в неинициализированной dollars переменной.

5. @Новинка C имеет семантику значений. = Оператор копирует непосредственное значение правого операнда в левый операнд. Он не объявляет равенство или отношение.

Ответ №1:

Выражение в объявлениях вычисляется немедленно

Следующие операторы инициализируют переменные, используя выражение, вычисляемое немедленно с помощью dollars as it is know в этот точный момент:

 double pesos = dollars * 26;
double reais = dollars * 5.9;
double soles = dollars * 3.53;
  

Это не похоже на формулы Excel, которые будут пересчитаны на основе последнего известного значения. Вот почему:

  • в первом случае вычисление выполняется до ввода пользователем. Вы можете увидеть странные результаты, потому dollars что он еще не был инициализирован. Кстати, лучше инициализируйте переменные, которые вы объявляете.

  • во втором случае вычисление производится после ввода пользователем dollars и, следовательно, обеспечивает ожидаемый результат.

Функции могут вычислять выражение, когда вам это нужно

Если вы хотите определить общую формулу для выполнения вычисления без немедленного выполнения вычисления, вам следует определить функции:

 double pesos(double dollars) {return dollars * 26;}
double reais(double dollars) {return  dollars * 5.9;}
double soles(double dollars) {return  dollars * 3.53;}
  

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

 std::cout << "In mexican pesos, that's " << pesos(dollars) << "n";
std::cout << "In brazilean reals, that's " << reais(dollars) << "n";
std::cout << "In peruvian soles, that's " << soles(dollars) << "n";
  

Вы можете вызывать одну и ту же функцию несколько раз, чтобы всегда получать актуальные вычисления на основе предоставленного параметра:

 std::cout << "3.14 dollars in brazilean reals is " << reais(3.14) << "n";
std::cout << "500/3 dollars in brazilean reals is " << reais(500.0/3.0) << "n";
double another_value=0.0;  
std::cin >> another_value; 
std::cout << another_value << "dollars in brazilean reals is " << reais(another_value) << std::endl;