C++ - rzutowanie 3 sposobami, inne wyniki

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:

#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ę:

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

na:

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

lub:

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.

2

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

((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

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

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

std::cout<< pow( liczba, static_cast< float >( 1 ) / stopien )<<std::endl;

1 użytkowników online, w tym zalogowanych: 0, gości: 1