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

Zagadka z C++ #1

+5 głosów
2,606 wizyt
pytanie zadane 17 czerwca 2015 w C i C++ przez Radfler VIP (101,030 p.)
edycja 20 maja 2016 przez Radfler

Witam. Naszła mnie chęć zadania zagadki na forum, tak trochę dla rozluźnienia :) Oto jej treść:

Dany jest kod:

struct {

    int         position;
    const char* var_name;

} outs; // <- definicja obiektu

int main() { }

Pytanie brzmi: Jakiego typu jest zmienna outs?

No coś takiego! Poziom trudności określam raczej jako łatwy ;)

EDIT (dla nie rozumiejących):

Chodzi o to jakiego typu jest obiekt (zmienna) outs. Czy jest to int, std::string, może const char*? Chodzi po prostu o typ danych!

EDIT 2:

Prawidłową odpowiedź podał daan! Specyfikator decltype() zwraca typ wyrażenia podanego w nawiasie. Przed C++11 nie moglibyśmy podać typu (byłby po prostu anonimowy). https://forum.pasja-informatyki.pl/12004/co-oznacza-specyfikator-decltype

9 odpowiedzi

+3 głosów
odpowiedź 18 czerwca 2015 przez daan Pasjonat (17,640 p.)
wybrane 18 czerwca 2015 przez Radfler
 
Najlepsza

Ja bym powiedział, że zmienna outs jest typu decltype(outs) enlightened

komentarz 18 czerwca 2015 przez Radfler VIP (101,030 p.)
I o to chodziło :D
komentarz 18 czerwca 2015 przez Radfler VIP (101,030 p.)

I z tego co pamiętam to sam wyjaśniałeś mi co robi decltype() :D https://forum.pasja-informatyki.pl/12004/co-oznacza-specyfikator-decltype

komentarz 18 czerwca 2015 przez daan Pasjonat (17,640 p.)
dobrą masz pamięć ! hehe :D
+2 głosów
odpowiedź 17 czerwca 2015 przez niezalogowany
Zmienna outs jest anonimowa.
komentarz 17 czerwca 2015 przez niezalogowany
Właściwie to stuktura jest anonimowa.
komentarz 17 czerwca 2015 przez Radfler VIP (101,030 p.)
Była anonimowa przed rokiem 2011. Teraz typ można spokojnie określić :)
komentarz 17 czerwca 2015 przez criss Mędrzec (172,570 p.)
Tutaj chyba dużo podpowiedziałeś, Radfler :D Faktycznie na wikipedii piszą o jakichś zmianach w definicji struktur, ale i tak nie wiem jak odpowiedzieć :c
komentarz 18 czerwca 2015 przez niezalogowany
W takim razie zapewne "outs" będzie typem samym w sobie?
komentarz 18 czerwca 2015 przez Radfler VIP (101,030 p.)
Nie, to tylko obiekt. Istnieje pewna możliwość, aby dostać się do jego typu :) Wystarczy poszukać...
+1 głos
odpowiedź 17 czerwca 2015 przez draghan VIP (106,230 p.)
Ciekawy jestem, czy młodsi* podrzucą poprawną odpowiedź. :) Będę paczał. >.-

___________
* młodsi w ujęciu programistycznego stażu - np. ci z Was, którzy, np. dopiero dzięki panu Mirosławowi zainteresowali się programowaniem i wciąż się uczą**. :)

** ...chociaż wiadomo, że człowiek uczy się przez całe życie... :)
+1 głos
odpowiedź 18 czerwca 2015 przez draghan VIP (106,230 p.)

Nie wierzę! To jakby chcieć powiedzieć, że jest rozmiaru sizeof(outs)...

decltype() to nie jest żaden typ, tylko operator. Typem outs jest anonimowa struktura.
ZłapZabijZakop podał poprawną odpowiedź.

komentarz 18 czerwca 2015 przez Radfler VIP (101,030 p.)
Dla programisty jest to typ anonimowy, dla kompilatora taki jak każdy inny? Chyba logiczne :v
komentarz 18 czerwca 2015 przez draghan VIP (106,230 p.)

...a my jesteśmy programistami, czy kompilatorami...? smiley

komentarz 18 czerwca 2015 przez Radfler VIP (101,030 p.)
No programistami... :v Ale wiesz, jakbyś mimo wszystko chciał znać 'prawdziwy typ' takiego anonima to trzeba użyć decltype() :p
komentarz 18 czerwca 2015 przez draghan VIP (106,230 p.)
Nie, jest zasadnicza różnica między znać typ, a ponownie użyć typu.

Znany typ obiektu outs to nienazwana struktura. A żeby ponownie użyć takiego anonima, jak go ładnie określiłeś, należy skorzystać z decltype(). :)

Czy rozumiesz, dlaczego nie machnę na to ręką? To są dwie różne sprawy, nie są one tożsame.

Anyway - osobiście czekam na kolejną zagadkę. ;D
komentarz 18 czerwca 2015 przez Radfler VIP (101,030 p.)

No dobra, niech będzie! Ogólnie odpowiedzi daana i ZlapZabijIZakop są prawidłowe, ale jak dla mnie daan poszedł o krok dalej pokazując co to za typ (no i zrobił to w stylu C++11 yes) :)

+1 głos
odpowiedź 18 czerwca 2015 przez Pan Kulomb Pasjonat (18,630 p.)
Można robić struct {}; oraz class {}; bez nazwy?
komentarz 18 czerwca 2015 przez Radfler VIP (101,030 p.)
Można, tylko z tego co wiem trzeba utworzyć co najmniej jeden obiekt tego typu.
0 głosów
odpowiedź 17 czerwca 2015 przez Wiciorny Ekspert (283,300 p.)
zależy czy odwołamy się w wywołaniu do :) pozycji czy nazwy :)
komentarz 17 czerwca 2015 przez draghan VIP (106,230 p.)
Ja tylko dorzucę małe sprostowanie, że typ w C++ jest określany raz, przy (przed?) konstrukcji obiektu - ergo jest niezależny od czynników "zewnętrznych". :)
0 głosów
odpowiedź 17 czerwca 2015 przez kotfuterkowy Dyskutant (9,220 p.)
strukturalnego, ale po co to właściwie?
komentarz 17 czerwca 2015 przez draghan VIP (106,230 p.)
Trochę mało precyzyjna odpowiedź. :P

I po co co? ;D
0 głosów
odpowiedź 17 czerwca 2015 przez Adrian1999 Nałogowiec (34,570 p.)
Taaak, jak się nie mylę struct służy do przechowywania większej ilości danych. Czyli do przechowywania zmiennych takich jak pozycja, imię czy nazwisko. Zamiast robić tysiąc zmiennych i brzydko wywołując monżna stworzyć ,, outs pierwsze, pierwsze.position=4;" Jak się nie mylę w strukturzę również da się stworzyć konstruktor więc, według mnie struktura jest to po prostu no SYN/CÓRKA klasy. Różni się tylko tym od klasy że nie można zastrzec danych ,,public,private,protected itd" Nie wiem czy dobrze zrozumiałem pytanie ale taka jest moja odpowiedź
komentarz 17 czerwca 2015 przez draghan VIP (106,230 p.)
W C++ dla struktury można również deklarować specyfikatory dostępu. :) Struktura od klasy różni się jedynie domyślnym specyfikatorem: w klasie jest to private, w strukturze public. :)
komentarz 17 czerwca 2015 przez Radfler VIP (101,030 p.)
Opisałeś mi czym jest struktura. A mi chodzi o typ obiektu outs. Zauważ, że nie jest to nazwa tej struktury, tylko obiekt. Typem jest np. int, double czy std::ostream. Sama struktura służy właśnie do utworzenia takiego typu :)
komentarz 17 czerwca 2015 przez Adrian1999 Nałogowiec (34,570 p.)
Czyli chodzi ci o to że to jest typ który ma stałą nazwę który jest ciągiem znaków oraz przechowuje liczbę całkowitą ?
komentarz 17 czerwca 2015 przez Radfler VIP (101,030 p.)
Tak, typ zmiennej outs to zwykła nazwa, tylko trochę skomplikowana :p
komentarz 17 czerwca 2015 przez Adrian1999 Nałogowiec (34,570 p.)
Zagadka number one odgadnięta ^_^
0 głosów
odpowiedź 17 czerwca 2015 przez Dash Nałogowiec (29,650 p.)
Jeżeli dobrze dedukuję, to jest zupełnie nowy typ zmienniej. Określić czy zwracany int czy char czy jeszcze coś innego można byłoby , gdyby zamiast struktury użyta była unia ( a i tak nieprecyzyjnie, bo typ mógłby się zmieniać w trakcie trwania programu). Outs zawiera w sobie oba powyższe typy podstawowe. Mam rację?
komentarz 17 czerwca 2015 przez draghan VIP (106,230 p.)
I tak, i nie... ;) Obiekt może posiadać tylko jeden konkretny typ. :) Zgadywanka polega na określeniu, jaki to typ. :)
komentarz 17 czerwca 2015 przez Radfler VIP (101,030 p.)
Tak, outs zawiera to dwa typy, gdyż jest obiektem pewnego typu. Chodzi o to jaki to typ, czyli jaka jest jego nazwa :)
komentarz 17 czerwca 2015 przez Dash Nałogowiec (29,650 p.)
edycja 17 czerwca 2015 przez Dash
To trochę komplikuje sprawę ... Zakładam że jest wskaźnikiem, ale nie chciałbym się za bardzo ośmieszyć, więc lepiej jak zamilknę :P

@Edit: Strzelam ze int, jako najnaturalnieszy typ dla kompilatora. Jednak z niecierpliwością czekam na właściową odpowiedź!

Podobne pytania

0 głosów
2 odpowiedzi 973 wizyt
pytanie zadane 22 czerwca 2015 w C i C++ przez dariusz Obywatel (1,800 p.)
+5 głosów
12 odpowiedzi 4,894 wizyt
pytanie zadane 22 listopada 2015 w Rozwój zawodowy, nauka, praca przez Pixel040 Gaduła (3,100 p.)
+1 głos
5 odpowiedzi 7,531 wizyt

93,742 zapytań

142,678 odpowiedzi

323,297 komentarzy

63,328 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...