2016-08-04 18 views
5

Zauważyłem ten blok kodu dzisiaj i zastanawiałem się, czy tego typu operacje są gdzieś udokumentowane i dlaczego zostało to zrobione w ten sposób (wydajność itp.).Czy operator mnożenia jest udokumentowany dla zestawów?

var 
    Shift: TShiftState 
begin 
    if [ssShift, ssCtrl] * Shift <> [] then 
    begin 
    ... 
    end; 
end; 

Wydaje mi z moich testów i po prostu patrząc na kod jak to jest sprawdzenie czy zmiany biegów zawiera albo ssShift lub ssCtrl. Czy to udokumentowane zachowanie, czy po prostu wykorzystuje fakt, że zestaw jest wewnętrznie przechowywany jako liczba całkowita?

+0

wewnętrzną reprezentację całkowitą nie byłyby wystarczające, aby umożliwić danej kalkulacji wszystko sama. –

Odpowiedz

11

To nie jest operator mnożenia, gdy jest używany z zestawami; to jest operator skrzyżowania. Jest to udokumentowane i było od czasów sprzed Delphi. Patrz: Expressions, w szczególności sekcja dotycząca operacji ustawiania. Są standardowymi operatorami matematycznymi dla związków, skrzyżowań, pod- i super-zestawów, równości, nierówności i członkostwa.

Oto podsumowanie tabeli z docs:

 
Operator Operation  Operand Types Result Type Example 
-------- ---------  ------------- ----------- ------- 
+   union  set   set   Set1 + Set2 
-   difference set   set   S - T 
*   intersection set   set   S * T 
<=   subset  set   Boolean  Q <= MySet 
>=   superset  set   Boolean  S1 >= S2 
=   equality  set   Boolean  S2 = MySet 
<>   inequality set   Boolean  MySet <> S1 
in   membership ordinal, set Boolean  A in Set1 
+0

Dzięki, właśnie tego szukałem. Nigdy nie myślałem, żeby spojrzeć na wyrażenia. Patrzyłem na zestaw definicji pod http://docwiki.embarcadero.com/RADStudio/Berlin/en/Structured_Types_(Delphi). I naprawdę powinienem wiedzieć, że pracuję nad językiem od czasów starych Turbo Pascal :) – Graymatter

+0

Skorzystaj z linku na dole tej dokumentacji ...... –

+1

Wyszukiwanie w docwiki dla operatorów zestawów daje ci tę stronę jako pierwsze trafienie . –

Powiązane problemy