W sekcji 10.5.1 nowej książki Stroustrupa "Język programowania C++ - wydanie czwarte" mówi on, że przed wykonaniem operacji arytmetycznej, integralna promocja jest używana do tworzenia intów z krótszych typów całkowitych, podobnie jak zmiennoprzecinkowe promocja służy do tworzenia podwładnych.Promocja zmiennoprzecinkowa: stroustrup vs kompilator - kto ma rację?
Potwierdzałem pierwsze żądanie z następującego kodu:
#include <iostream>
#include <typeinfo>
int main()
{
short a;
short b;
std::cout << typeid(a + b).name() << std::endl;
}
Ten wynik "int" z VC++ i "I" na GCC.
Ale sprawdzając je za pomocą pływaków zamiast szortów, wyjście jest nadal „pływak” lub „f”:
#include <iostream>
#include <typeinfo>
int main()
{
float a;
float b;
std::cout << typeid(a + b).name() << std::endl;
}
Według Stroustrup nie istnieją wyjątki od zmiennoprzecinkowej promocyjnej-reguły, więc oczekiwano "podwójny" lub "d" jako wynik.
Czy wspomniana sekcja dotycząca promocji jest błędna lub niejasna? Czy jest jakaś różnica w C++ 98 i C++ 11 w zakresie promocji typu?
Uważam, że awans z 'float' na' double' występuje tylko w przypadku * mixed * arithmethic; to znaczy, kiedy dodajemy 'float' i' double' razem, 'float' jest najpierw promowany przed przeprowadzeniem dodawania. Jesteś pewien, że tak nie jest? –
'int' to" minimalny poziom "dla całkowej arytmetyki w C++, a' float' to "minimalny poziom" dla arytmetyki zmiennoprzecinkowej. – Xeo
Właśnie zacytowałem książkę. Wyraźnie mówi, że pływaki awansują do debli. Nie robi też ani słowa "arytmetyka mieszana", tylko "przed operacją arytmetyczną". – kiba