Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

niezrozumiałe działnie kodu int y(int(x));

Ostatnio zmodyfikowano 2016-04-28 21:07
Autor Wiadomość
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ć.

C/C++
#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:
C/C++
int y( int( 3.14 ) ); //y = 3


Gdzie jest więc myk który przeoczyłem?
P-147750
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).
P-147755
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?
P-147757
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).
P-147758
pozdro600
Temat założony przez niniejszego użytkownika
» 2016-04-28 18:04:59
czy w takim razie to też jest deklarowana funkcja?
C/C++
int y( 3 );
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?
C/C++
int y( int( 3.14 ) );
P-147759
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
P-147761
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.
P-147762
« 1 »
  Strona 1 z 1