Co oznacza zapis (-2)[p] ?

0

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.

10

(-2)[p] == p[-2] == *(p - 2)
http://cpp.sh/6kysu

0

Dzięki :)

0

Jaki sens mają tego typu konstrukcje, które powiedzmy sobie szczerze są bardzo nieczytelne? Po co takie zapisy?

0
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.

1

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.

5

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ć (:

http://eel.is/c++draft/expr.sub#1

1 użytkowników online, w tym zalogowanych: 0, gości: 1