C++ - rzutowanie 3 sposobami, inne wyniki

C++ - rzutowanie 3 sposobami, inne wyniki
P1
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 7 lat
  • Postów:15
0

Cytat, źródło: http://pl.wikibooks.org/wiki/C++/Zmienne#Rzutowanie

W języku C rzutowanie wyglądało w następujący sposób:

int zmienna_calkowita = (int)zmienna_rzeczywista;

W C++ nadal można używać takiego rzutowania, jest ono nazywane
"rzutowaniem w stylu C". Oprócz tego C++ oferuje "rzutowanie w stylu
funkcyjnym":

int zmienna_calkowita = int(zmienna_rzeczywista);

które działa dokładnie tak samo.

...

int zmienna_całkowita = static_cast<int>(zmienna_rzeczywista);

Teraz mój przykładowy program - obliczanie pierwiastka n-tego stopnia z liczby:
Działająca wersja:

Kopiuj
#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    int liczba, stopien;
    cin >> liczba >> stopien;    
    cout << pow (liczba, (float)1/stopien);
    cin.get();
    cin.get();
    return 0;
}

Jednak problem pojawia się gdy zamienię:

Kopiuj
cout << pow (liczba, (float)1/stopien);

na:

Kopiuj
cout << pow (liczba, float(1/stopien));

lub:

Kopiuj
cout << pow (liczba, static_cast<float>(1/stopien));

Nie rozumiem, dlaczego z jednym działa a z drugim nie chce działać - mimo iż teoretycznie wg tamtej strony:

działa dokładnie tak samo.

Pozdrawiam.

byku_guzio
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 7 lat
2

Rzutowanie działa tak samo. Tylko, że w tym wypadku rzutujesz różne rzeczy.
W pierwszym przypadku masz:

Kopiuj
((float)1)/stopien

w pozostałych rzutujesz dopiero wynik dzielenia, a nie jego dzielną. Dzielenie, w którym biorą udział 2 liczby całkowite da zawsze wynik będący liczbą całkowitą. Dopiero gdy jedna z liczb będzie typem zmiennoprzecinkowym wynik też będzie zmiennoprzecinkowy.

Kwestia priorytetów operatorów - rzutowanie ma wyższy priorytet: http://pl.wikibooks.org/wiki/C/Operatory#Priorytety_i_kolejno.C5.9B.C4.87_oblicze.C5.84


edytowany 1x, ostatnio: byku_guzio
pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
1
Kopiuj
cout << pow (liczba, float(1.0/stopien));

do not code, write prose
EM
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 10 lat
  • Postów:271
1

Jak już byku_guzio napisał kwestia priorytetów operatorów

Kopiuj
std::cout<< pow( liczba, static_cast< float >( 1 ) / stopien )<<std::endl;
edytowany 1x, ostatnio: emacs

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.