2016-05-05 3 views
-1

Я просто поразил странное поведение при компиляции небольшой C++-программы с g ++ (4.6.3). Сравните два поплавка по Цельсию и тест:Странное поведение компилятора

#include <iostream> 
using namespace std; 

int main() { 
    float fahrenheit = 0; 
    float celsius = 0; 
    float test = 0; 

    cout << "Temperature in °F: " << endl; 
    cin >> fahrenheit; 

    celsius = 5/9 * (fahrenheit - 32); 
    test = 5 * (fahrenheit - 32)/9; 

    cout << "\nWrong:\t" << fahrenheit << " °F = " << celsius << " °C" << endl; 
    cout << "Correct:" << fahrenheit << " °F = " << test << " °C" << endl; 
} 

Я составил это всего лишь «г ++ test.cpp -o тест».

Это выход из программы:

$ ./test 
Temperature in °F: 
1000 

Wrong: 1000 °F = 0 °C 
Correct:1000 °F = 537.778 °C 

Может кто-нибудь объяснить мне, почему г ++ делает (воспроизводимо) вычисляют по Цельсию до 0, в то время как тест содержит правильное решение? Имеет ли это какое-то отношение к некоторой оптимизации, хотя я не задавал никаких аргументов для этого? Или это действительно ошибка в некотором роде?

+0

Целое подразделение !!! –

ответ

2

5/9 = 0

0 * ничего = 0

При делении на целые, вы получите целое число обратно. Вы можете просто сказать 5.0/9, и это должно быть намного лучше.

Когда вы пишете код и не получаете то, что ожидаете, ваше первое наклонение должно быть «что делать?» I не так ли? » а не «что сделал компилятор неправильно?»

Это поможет вам в правильном месте в любое время.

+0

Да, это гвозди. Благодаря! – Mark

+0

Это очень распространенная ошибка .. в основном для новичков, но время от времени она укусит меня в прикладе. Если это решит ваш вопрос, пожалуйста, примите его как ответ, установив флажок слева. Если вы считаете, что это хороший ответ, вы также можете нажать стрелку вверх. – xaxxon

Смежные вопросы