• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zmiana typu zmiennej w trakcie programu

VPS Starter Arubacloud
+1 głos
1,207 wizyt
pytanie zadane 9 lutego 2021 w C i C++ przez melman666 Nowicjusz (210 p.)

Witam

Czy można zmienić typ zmiennej w trakcie wykonywania instrukcji?
Mam taki przykład gdzie chciałbym zmienić typ zmiennej z na float, aby wynik był zmiennopozycyjny

#include <iostream>
using namespace std;

int main()
{
    int x = 2;
    int y = 4;
    int z;
    
    z = 2 * float(x) + float(y) / 3;
    cout << "Zmienna z wynosi " << z << endl;

    return 0;
}

 

3 odpowiedzi

+2 głosów
odpowiedź 9 lutego 2021 przez mokrowski Mędrzec (155,460 p.)

W przypadku kodu który umieściłeś, zbędne wydaje się "zmienianie typu zmiennej". Możesz po prostu deklarować z jako float. Możesz także obliczenie wykonać do innej zmiennej typu float.

float r = 2 * float(x) + float(y) / 3;

Możesz nawet uniknąć rzutowania poprzez wykonanie operacji arytmetycznych na typach float.

auto r = 2.0F * x + y / 3.0F;

W ostateczności, jeśli wynik jest Ci potrzebny jedynie do wyświetlenia, możesz obliczenie wykonać w trakcie wyprowadzania danych.

cout << "Zmienna z wynosi " << (2.0F * x + y / 3.0F) << endl;

Jeśli jednak masz rzeczywistą potrzebę (a w Twoim przypadku tak nie jest) umieszczenia kilku typów danych w zmiennej, możesz użyć:

1. Unii: https://en.cppreference.com/w/cpp/language/union

2. Variant: https://en.cppreference.com/w/cpp/utility/variant

3. Any: https://en.cppreference.com/w/cpp/utility/any

4. Optional: https://en.cppreference.com/w/cpp/utility/optional (w określonych przypadkach)

+1 głos
odpowiedź 9 lutego 2021 przez tangarr Mędrzec (154,780 p.)

Jeżeli chcesz mieć zmienną typu float to użyj zmiennej typu float.

#include <iostream>
using namespace std;
 
int main()
{
    int x = 2;
    int y = 4;
    float z;
     
    z = 2 * x + y / 3.0f;
    cout << "Zmienna z wynosi " << z << endl;
 
    return 0;
}

 

komentarz 9 lutego 2021 przez melman666 Nowicjusz (210 p.)
Chcę żeby zmienna z była na początku zadeklarowana jako int, a w instrukcji obliczania chciłabym ją zmienić np. (float)z = 2 * x + y / 3.0f;

tylko że taki zapis nie dziala
komentarz 9 lutego 2021 przez tangarr Mędrzec (154,780 p.)
C++ jest językiem silnie typowanym. Nie da się w nim zmienić typu zmiennej!
komentarz 9 lutego 2021 przez mokrowski Mędrzec (155,460 p.)

@tangarr,  a pojęcie rzutowania znasz? Przecież można pierwotny int rzutować na float w trakcie obliczeń. Lub odwrotnie. Po to masz w tym języku typy, by się ich trzymać.

komentarz 9 lutego 2021 przez tangarr Mędrzec (154,780 p.)
Jakiekolwiek rzutowanie byś wykonał to i tak nie zmienisz typu zmiennej (a o to pytał melman666).
komentarz 9 lutego 2021 przez mokrowski Mędrzec (155,460 p.)

Przecież można pierwotny int rzutować na float w trakcie obliczeń

Dlatego napisałem to wyraźnie :) A także wybrałem komentarz jako formę.

komentarz 9 lutego 2021 przez Wiciorny Ekspert (269,120 p.)

@mokrowski,rzutowanie to nie jest zmiana typu zmiennej, bo rzutując przypiszę to do innej zmiennej, więc zmieni wartość liczby, ale nie zmiennej z 

komentarz 9 lutego 2021 przez mokrowski Mędrzec (155,460 p.)

Czy można zmienić typ zmiennej w trakcie wykonywania instrukcji?

A drugie zdanie:

Mam taki przykład gdzie chciałbym zmienić typ zmiennej z na float, aby wynik był zmiennopozycyjny

Wybierz które chcesz.

komentarz 10 lutego 2021 przez Wiciorny Ekspert (269,120 p.)

zmienić typ zmiennej z na float, aby wynik był zmiennopozycyjny

to proszę napisz mi program zmieniający TYP ZMIENNEj, a nie jej wartość :) 
mianowicie nie przypisując rzutowaniem do innej zmiennej, tylko zmień typ zmiennej z. 
 

+1 głos
odpowiedź 9 lutego 2021 przez TOM_CPP Pasjonat (22,640 p.)

Zawsze możesz użyć std::any, chociaż w tym przypadku nie widzę takiej potrzeby.

[ Wymagany standard C++17 ]

#include <iostream>
#include <any>

using namespace std;

struct Foo
{
    int x {-7};
    bool n {true};
};
 
int main()
{    
    any z;
     
    z = 2.678f; 
    cout << "Zmienna z wynosi " << any_cast<float>(z) << endl;
    
    z = 56;
    cout << "Zmienna z wynosi " << any_cast<int>(z) << endl;
    
    z = "tekst"s;
    cout << "Zmienna z wynosi " << any_cast<string>(z) << endl;
    
    z = Foo{-15,false};
    cout << "Zmienna z wynosi " << any_cast<Foo>(z).x << endl;    
}

https://godbolt.org/z/s9KGf6

komentarz 10 lutego 2021 przez melman666 Nowicjusz (210 p.)

Wracając do mojego pytania, czy da się jakoś rzutować na zmienną zadeklarowaną na początku programu int z; 

#include <iostream>
#include <any> 
using namespace std;
 
int main()
{
    int x = 2;
    int y = 4;
    int z;
     
    any(z) = 2 * float(x) + float(y) / 3;
    cout << "Zmienna z wynosi " << z << endl;
 
    return 0;
}

 czy można to inaczej jeszcze zapisać?

Podobne pytania

+1 głos
2 odpowiedzi 508 wizyt
pytanie zadane 3 listopada 2017 w C i C++ przez PanJaqb Początkujący (360 p.)
0 głosów
1 odpowiedź 356 wizyt
pytanie zadane 31 października 2017 w C i C++ przez PanJaqb Początkujący (360 p.)
0 głosów
2 odpowiedzi 570 wizyt
pytanie zadane 13 sierpnia 2018 w Java przez DanielKowalskiX Początkujący (460 p.)

92,452 zapytań

141,262 odpowiedzi

319,077 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...