np. nie można pisać tak:
p[17] = ...
gdzie p jest wskaźnikiem, do dowolnego typu, np.:
double *p ;
Nie wiem skąd bierzesz tego typu rewelacje, ale oczywiście, że można (https://ideone.com/33WYnI):
var
P: PSingle;
begin
P[4] := 3.14; // modyfikacja
Write(P[4]); // odczyt
end.
a w c tablice i wskaźniki są tak samo traktowane..
W Pascalu nie ma znaczenia czy ma się tablicę czy typowany pointer, wskaźnik może być używany jako tablica, czyli tak jak w C.
int t[10], *p;
p = t; // tak wolno
Fajna pułapka. Ale pomijając ten fakt, w Pascalu też tak można (https://ideone.com/tMyoeQ):
var
T: array [0..9] of Single;
P: PSingle;
begin
P := T; // pozyskanie adresu tablicy
P[4] := 3.14; // modyfikacja komórki
Write(P[4]); // odczyt z komórki
end.
a potem:
p++ = 7;
Pre- i post- inkrementacji i dekrementacji w Pascalu nie ma. Bardzo dobrze — mniej pułapek, większa czytelność i bezpieczeństwo. Gdyby te operatory były to i tak bym ich nie używał, bo nie przepadam za obfuskacją kodu.
w c jest ten operator ?:, co pozwala skracać kod...
x = (a > b) ? 7 : 9;
W Pascalu nie ma, a szkoda — korzystałbym w niektórych przypadkach. Ale zamiast tego jest funkcja IfThen
, które pełni podobną rolę — z tą różnicą, że wykonuje pełną ewaluację wszystkich wejściowych argumentów, więc to nie to samo — to zwykła funkcja, nie operator.
albo takie coś:
y = ((x > pi) ? sin : cos) (x);
Kolejna abstrakcja, która tylko obfuskuje kod. Nie różni się to niczym od tego:
y = x > pi ? sin(x) : cos(x);
ani od tego:
y := ifthen(x > pi, sin(x), cos(x));
i dalej: w pas nie ma #define, co znowu pozwala na lepsze - krótsze kodowanie w c...
Oczywiście, że jest {$DEFINE}
. Jeśli mowa o preprocesorze i makrach, bo tym właśnie są {$DEFINE}
, to Free Pascal je wspiera, łącznie z zagnieżdżonymi makrami. Jednak Free Pascal nie posiada wsparcia parametryzowanych makr, aby dbać o czytelność i bezpieczeństwo kodu oraz o łatwość debugowania, dlatego nie da się robić w nim takiego spaghetti jak w C.
w c++ są też te operatory przeładowane, destruktory, i kilka innych rzeczy - dlatego c++ jest lepszy od pas++ :)
Przeładowywanie operatorów jest od dawna dostępne we Free Pascalu, destruktory również (WTF z tymi destruktorami?) i kilka innych rzeczy też — dlatego C/C++ wcale nie mają żadnej realnej przewagi nad współczesnymi Pascalami.
Jeśli chcesz podyskutować o różnicach pomiędzy C/C++ a Pascalem, to zanim wylistujesz kolejne bzdurki (czyli okłamiesz czytelników tego wątku), sugeruję najpierw poznać Pascala (głównie Free Pascala i Delphi), bo najwyraźniej nie masz za bardzo pojęcia o tym, czym jest współczesny Pascal, co wspiera i na co go stać.
Poza tym, inteligentnych ludzi cechuje to, że jeśli czegoś nie wiedzą lub nie są pewni, to zadają pytania, zamiast stawiania (kłamliwych) twierdzeń. Jeśli nie wiesz czy coś jest wspierane w Pascalu, to zapytaj, a z chęcią podam ci szczegóły.