pozdro600 Temat założony przez niniejszego użytkownika |
niezrozumiałe działnie kodu int y(int(x)); » 2016-04-28 16:04:11 Cześć, jestem nowy w programowaniu, natrafiłem na pierwszy problem, który nie potrafię wygooglać. #include <iostream> using namespace std;
int main() { double x = 3.14; int y( int( x ) ); cout << y; return 0; }
Dlaczego w wyniku y = 1, a nie 3. Wiem, że rzutowanie int(3.14) = 3 i że y(3), to to samo co y = 3, a na dodatek dla zapisu: Gdzie jest więc myk który przeoczyłem? |
|
Monika90 |
» 2016-04-28 17:08:59 Pewnie Cię to zaskoczy, ale to int y( int( x ) ); to jest deklaracja funkcji. Funkcja o nazwie y zwraca int i ma jeden parametr x typu int. Więc to cout << y; drukuje adres funkcji y po konwersji do bool, (wartość true jest drukowana jako 1). |
|
carlosmay |
» 2016-04-28 17:38:42 Więc to cout << y; drukuje adres funkcji y po konwersji do bool, (wartość true jest drukowana jako 1). |
Dlaczego adres jest konwertowany do bool , a nie wypisany jako szesnastkowy int ? Taka specyfika tego konkretnego środowiska, czy reguła? |
|
Monika90 |
» 2016-04-28 17:49:24 Strumień ma operator << (const void*) który drukuje adres. Wskaźniki do obiektów mogą być niejawnie konwertowane do void* więc w ich przypadku ten operator zostanie użyty. Wskaźniki do funkcji nie mogą być konwertowane do void*, więc ten operator odpada, zostaje operator << (bool). |
|
pozdro600 Temat założony przez niniejszego użytkownika |
» 2016-04-28 18:04:59 czy w takim razie to też jest deklarowana funkcja? czy po prostu przypisanie wartości 3 do y (y = 3) Czemu to poniżej zwraca 3, a nie 1? nie jest to to samo co problematyczny kod z nazwy tematu? |
|
Monika90 |
» 2016-04-28 18:28:18 Zasada jest taka: jeżeli coś da się zinterpretować jako deklarację funkcji to tak będzie to zinterpretowane, w przeciwnym wypadku kompilator będzie próbował innej interpretacji, np. definicja zmiennej. int y( int( x ) ); to da się zinterpretować jako deklarację funkcji, x to nazwa parametru. int y( int( 3.14 ) ); tego się nie da, bo 3.14 nie może być nazwą parametru. To dziwne zjawisko ma nawet nazwę https://en.wikipedia.org/wiki/Most_vexing_parse |
|
Elaine |
» 2016-04-28 21:07:30 Mówiąc ściślej, zachowanie tego kodu jest niezdefiniowane, ponieważ odr-użyta funkcja y nie posiada definicji. Wynikiem równie dobrze mogłoby być "Hello world!". To, że wypisuje 1, jest prawdopodobnie efektem tego, że kompilator już na etapie kompilacji zauważa (zgodnie ze standardem, ale nie do końca zgodnie z rzeczywistymi implementacjami), że wskaźnik na tą funkcję nigdy nie jest równy nullptr, więc kompilator pomija konwersję tego wskaźnika na bool i na sztywno wbija 1 w kod wynikowy, przez co w generowanym kodzie czystym przypadkiem okazuje się, że funkcja y nie jest odr-użyta. |
|
« 1 » |