Znalazłem coś takiego jako "podchwytliwe" zadanie, nie było odpowiedzi i nie daje mi spokoju co to właściwie oznacza? Kompiluje się bez żadnego warninga.
(-2)[p]
gdzie p to wskaźnik na tablicę intów.
(-2)[p] == p[-2] == *(p - 2)
http://cpp.sh/6kysu
Dzięki :)
Jaki sens mają tego typu konstrukcje, które powiedzmy sobie szczerze są bardzo nieczytelne? Po co takie zapisy?
Krwawy Kaczor napisał(a):
Jaki sens mają tego typu konstrukcje, które powiedzmy sobie szczerze są bardzo nieczytelne? Po co takie zapisy?
By zgrywać mądrale jako rekruter albo egzaminator.
Sensu się w tym nie doszukuj. To po prostu konsekwencja tego, że w C zapis X[Y]
to cukier składniowy na *(X + Y)
, co siłą rzeczy jest tym samym co *(Y + X)
a więc i tym samym co Y[X]
, gdzie X
i Y
to dowolnie złożone wyrażenia.
w C++ dla klas może być przeciążony operator[]
, ale w przypadku prostych tablic czy wskaźników ma zastosowanie reguła z języka C.
Jak już tu jesteśmy to warto dodać, że X[Y]
nie zawsze jest tym samym co Y[X]
, w kontekście maszyny abstrakcyjnej. W standardzie jest zapis, że ~
Dla wyrażenia E1[E2], E1 wykona się przed E2
Mając to na uwadze można łatwo pokazać, że te dwa sposoby nie zawsze dają taki sam wynik, np:
#include <cstdint>
#include <iostream>
int foo_arr[5];
int* foo()
{
std::cout << "foo\n";
return foo_arr;
}
int bar()
{
std::cout << "baz\n";
return 0;
}
int main()
{
foo()[bar()];
std::cout << "\n\nvs\n\n";
bar()[foo()];
}
Oczywiście nie mówię, że takie coś jest fajne i nic tylko pchać na produkcję, ale jak Wasze E1 i E2 mają side efekty to warto się nad tym zastanowić (:
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.