Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez a cikk az X++-ban támogatott operátorokat ismerteti.
Assignment operators
A hozzárendelés-operátor módosítja egy változó vagy mező értékét. Az alábbi táblázat az X++ hozzárendelési operátorokat mutatja be. Nincs különbség az előtag és a postfix operátor között.
| Operator | Description |
|---|---|
= |
Rendelje hozzá az egyenlőségjel jobb oldalán lévő kifejezést a bal oldali változóhoz. |
+= |
Rendelje hozzá az aktuális változó értékét és a jobb oldali kifejezést a bal oldali változóhoz. |
++ |
Növelje a változót 1-zel. |
-= |
Rendelje hozzá az aktuális változó értékét a jobb oldali kifejezéssel a bal oldali változóhoz. |
-- |
A változó decrementációja 1-sel. |
Példakódok hozzárendelési operátorokhoz
// An example of assignment operators and their output.
static void Example1()
{
int i = 1;
// Using the = operator. i is assigned the value of i, plus 1. i = 2.
i = i + 1;
info(strFmt("Example 1: The result is "), i); // The result is 2.
}
static void Example2()
{
int i = 1;
// Using the += operator. i is assigned the value of i, plus 1.
// i = 2 (i = i + 1).
i += 1;
info(strFmt("Example 2: The result is "), i); // The result is 2.
}
static void Example3()
{
int i = 1;
// Using the ++ operator. i is incremented by 1, and then
// by 1 again in the second statement. The final value of i is 3.
i++;
++i;
info(strFmt("Example 3: The result is "), i); // The result is 3.
}
static void Example4()
{
int i = 1;
// Using the -= operator. i is assigned the value of i minus 1.
// i = 0 (i = i - 1).
i -= 1;
info(strFmt("Example 4: The result is "), i); // The result is 0.
}
static void Example5()
{
int i = 1;
// Using the -- operator. i is decremented by 1, and then by
// 1 again in the second statement. The final value of i is -1.
i--;
--i;
info(strFmt("Example 5: The result is "), i); // The result is -1.
}
Arithmetic operators
Számtani operátorok használata numerikus számítások végrehajtásához. A legtöbb operátor bináris, és két operandust vesz fel. A nem (~) operátor azonban unary, és csak egy operandust vesz igénybe. Bináris operátorok szintaxisa: kifejezés1ArithmeticOperatorkifejezés2 A nem szereplő operátorok szintaxisa: ArithmeticOperatorkifejezés1
| Operator | Description |
|---|---|
<< |
A bal oldali shift operátor a kifejezés2 bal oldali eltolását (szorzása 2-sel) hajtja végre a kifejezés1-en. |
>> |
A jobb oldali shift operátor a kifejezés2 jobb eltolását (2-sel osztás) hajtja végre a kifejezés1-en. |
* |
A szorzási operátor megszorozza a kifejezést1kifejezés2-vel. |
/ |
Az osztás operátor a kifejezést1kifejezés2 szerint osztja el. |
DIV |
Az egész szám osztás operátora a kifejezés1kifejezés2 szerinti egész osztását hajtja végre. |
MOD |
Az egész szám maradék operátora a kifejezés1kifejezés2 szerinti egész osztásának fennmaradó részét adja vissza. |
~ |
A nem operátor vagy unary operátor bináris nem műveletet hajt végre. |
& |
A bináris AND operátor egy bináris és egy műveletet hajt végre az 1 . kifejezésen és a kifejezés2 kifejezésen. |
^ |
A bináris XOR-operátor bináris XOR-műveletet hajt végre az 1. kifejezésen és a kifejezés2 kifejezésen. |
| |
A bináris VAGY operátor bináris vagy műveletet hajt végre az 1 . kifejezésen és a kifejezés2 kifejezésen. |
+ |
A plusz operátor kifejezés1-et ad hozzá a kifejezés2 kifejezéshez. |
- |
A mínusz operátor kivonja a kifejezés2 kifejezéstaz 1. kifejezésből. |
? |
A ternáris operátor három kifejezést vesz fel: kifejezés1 ? kifejezés2 : kifejezés3. Ha a kifejezés1 igaz, a függvény visszaadja a kifejezés2 kifejezést . Ellenkező esetben a függvény kifejezés3 értéket ad vissza. |
Példakódok aritmetikai operátorokhoz
int a = 1 << 4; // Perform four left shifts on 1 (1*2*2*2*2). a=16.
int b = 16 >> 4; // Perform four right shifts on 16 (16/2/2/2/2). b=1.
int c = 4 * 5; // Multiply 4 by 5. c=20.
int d = 20 / 5; // Divide 20 by 5. d=4.
int e = 100 div 21; // Return the integer division of 100 by 21. e=4 (4*21 = 84, remainder 16).
int f = 100 mod 21; // Return the remainder of the integer division of 100 by 21. f=16.
int g = ~1; // Binary negate 1 (all bits are reversed). g=-2.
int h = 1 & 3; // Binary AND. Return the bits that are in common in the two integers. h=1.
int i = 1 | 3; // Binary OR. Return the bits that are set in either 1 or 3. i=3.
int j = 1 ^ 3; // Binary XOR. Return the bits that are set in 1 and NOT set in 3, and vice versa. j=2.
int k = 1 + 3; // Add 1 and 3. k=4.
int l = 3 - 1; // Subtract 1 from 3. l=2.
int m = (400 > 4) ? 1 : 5; // If 400>4, 1 is returned. Otherwise, 5 is returned. Because 400>4, 1 is returned. m=1.
Expression operators
A as és is a kifejezés operátorai szabályozzák a lekért hozzárendeléseket. A lekért hozzárendelések osztály- vagy táblaöröklést foglalnak magukban. Az implicit módon lekért hozzárendelési utasítások olyan hibákat okozhatnak, amelyeket nehéz előrejelezni és diagnosztizálni.
as A kulcsszóval egyértelművé teheti a ledolgozott fájlokat.
is A kulcsszóval tesztelje, hogy a lefedés érvényes-e futásidőben.
Kulcsszóként
Használja a kulcsszót olyan as hozzárendelésekhez, amelyek egy alaposztály-változóból származtatott osztályváltozóra csökkentek. A as kulcsszó tájékoztatja a többi programozót és a fordítót arról, hogy ön szerint a leadás érvényes a futási idő alatt.
- A fordító hibát jelez a kulcsszót nem tartalmazó, lefelé irányuló hozzárendelési
asutasítások esetében. - Futtatáskor a
askulcsszó miatt a downcast-hozzárendelési utasítást hozzárendelinull, ha a lefedés érvénytelen. -
isA kulcsszó használatával biztonságosan tesztelje, hogy aaskulcsszó működik-e.
Példa a kulcsszóként használt kódra
A következő kód példában a Származtatott osztály kiterjeszti a BaseClass osztályt . A példakód két érvényes hozzárendelést tartalmaz a basec és a derivedc változók között. A basec-hez való felcímkésítési hozzárendeléshez nincs szükség a as kulcsszóra, de a származtatott adathoz tartozó downcast-hozzárendeléshez szükség van a as kulcsszóra. Az alábbi kód hiba nélkül fordít és fut.
static void AsKeywordExample()
{
// DerivedClass extends BaseClass.
BaseClass basec;
DerivedClass derivedc;
// BottomClass extends DerivedClass.
BottomClass bottomc;
derivedc = new DerivedClass();
// AS is not required for an upcast assignment like this.
basec = derivedc;
// AS is required for a downcast assignment like this.
derivedc = basec as DerivedClass;
bottomc = new BottomClass();
// AS causes this invalid downcast to assign null.
bottomc = basec as DerivedClass;
}
A kulcsszó
A is kulcsszó ellenőrzi, hogy egy objektum egy adott osztály altípusa-e. A is kifejezés igaz értéket ad vissza, ha az objektum az osztály altípusa, vagy ha az objektum ugyanaz a típus, mint az osztály. A fordító hibát jelez, ha egy is kulcsszókifejezés két típust hasonlít össze, de egyik típus sem a másik altípusa, és nem azonos típusúak. A fordító hasonló hibát jelez minden egyszerű hozzárendelési utasításhoz két típus között, ahol egyik típus sem a másik altípusa, és nem azonos típusúak. Futásidőben a mögöttes objektumra hivatkozó változó típusa nem releváns a is kulcsszóhoz. A is kulcsszó miatt a rendszer ellenőrzi, hogy a változó hivatkozik-e az objektumra, nem pedig az objektumra hivatkozó változó deklarált típusára.
Példakód a kulcsszóra
Az alábbi példakód azokat a feltételeket szemlélteti, amelyek azt szabályozzák, hogy egy is kifejezés igaz vagy hamis értéket ad-e vissza. A példakódok attól függenek, hogy az Űrlap és a Lekérdezés osztály egyaránt kiterjeszti a TreeNode osztályt.
// The compiler issues an error for the following code.
// The compiler ascertains that the Form class and the Query class are not
// part of the same inheritance hierarchy. Both the Form class and the Query class
// extend the TreeNode class, but neither Form nor Query is a subtype of the other.
Form myForm = new Form();
info(strFmt("%1", (myForm is Query)));
// The Infolog displays 0 during run time, where 0 means false. No supertype
// object can be considered to also be of its subtype class.
TreeNode myTreeNode = new TreeNode();
info(strFmt("%1", (myTreeNode is Form)));
// The Infolog displays 0 during run time, where 0 means false. A null
// reference causes the is expression to return false.
Form myForm;
info(strFmt("%1", (myForm is Form)));
// The Infolog displays 1 during run time, where 1 means true.
// An object is an instance of its own class type.
Form myForm = new Form();
info(strFmt("%1", (myForm is Form)));
// The Infolog displays 1 during run time, where 1 means true.
// Every subtype is also of its supertype.
Form myForm = new Form();
info(strFmt("%1", (myForm is TreeNode)));
// The Infolog displays 1 during run time, where 1 means true.
// The type of the underlying object matters in the is expression,
// not the type of the variable that references the object.
Form myForm = new Form();
TreeNode myTreeNode;
myTreeNode = myForm; // Upcast.
info(strFmt("%1", (myTreeNode is Form)));
Példa kódra az is és a kulcsszavak
Az alábbi példakód a kulcsszó tipikus használatát is tartalmazza. A as kulcsszót azután használja a rendszer, hogy a is kulcsszó ellenőrzi, hogy a as kulcsszó sikeres-e. Ebben a példában a is kulcsszavak nagybetűsek as , hogy láthatóbbá tegyék őket.
static void IsKeywordExample()
{
DerivedClass derivedc;
BaseClass basec;
basec = new DerivedClass(); // An upcast.
if (basec IS DerivedClass)
{
info("Test 1: (basec IS DerivedClass) is true. Good.");
derivedc = basec AS DerivedClass;
}
basec = new BaseClass();
if (!(basec IS DerivedClass))
{
info("Test 2: !(basec IS DerivedClass) is true. Good.");
}
}
//Output to the Infolog
Test 1: (basec IS DerivedClass) is true. Good.
Test 2: (!(basec IS DerivedClass)) is true. Good.
Objektumosztály különleges esetként
Az objektumosztály speciális esetként jelenhet meg az öröklési funkcióban. A fordító megkerüli az Objektum típusúnak deklarált változókhoz és változókhoz való hozzárendelések típusellenőrzését. Egyes osztályok az Objektum osztálytól öröklődnek, egyes osztályok pedig egy másik osztálytól, és egyes osztályok nem örökölnek egyik osztálytól sem. Bár a Párbeszédpanel osztály nem öröklődik egyik osztálytól sem, az alábbi példakódban szereplő hozzárendelési és hívási utasítások működnek. Ha azonban a hozzárendelés, bank4 = dlog3;akkor fordításkor sikertelen lesz, mert a Bank és a Párbeszédpanel osztály nem rendelkezik öröklési kapcsolattal egymással. A fordító csak egy kis ellenőrzést hajt végre egy objektumosztálynak deklarált változóhoz való hozzárendeléseken. A fordító ellenőrzi, hogy az objektumváltozóhoz rendelt elem egy osztálypéldány-e. A fordító nem engedélyezi a táblapuffer egy példányának hozzárendelését az objektumváltozóhoz. Emellett a fordító nem engedélyezi a primitív adattípusokat, például int az strobjektumváltozóhoz való hozzárendelést.
static void ObjectExample()
{
Bank bank4;
Object obj2;
Dialog dlog3 = new Dialog("Test 4.");
obj2 = dlog3; // The assignment does work.
obj2.run(false); // The call causes the dialog to appear.
info("Test 4a is finished.");
}
Tables
Minden tábla közvetlenül a Common system táblából örököl, kivéve, ha explicit módon örököl egy másik táblát. A Common tábla nem hozható létre. Nem létezik a mögöttes fizikai adatbázisban. A Common tábla az xRecord osztálytól öröklődik, de olyan speciális módon, amely nem felel meg a kulcsszónak vagy a isas kulcsszónak. Ha a as kulcsszót a táblák közötti érvénytelen lecímzés végrehajtására használják, a célváltozó egy használhatatlan, nem null entitásra hivatkozik. A célváltozó hivatkozásának törlésére tett minden kísérlet hibát fog okozni, amely leállítja a programot.
Az is and as keywords and extended data types
Minden kiterjesztett adattípushoz tartozik Egy Extends tulajdonság. Az öröklés stílusa, amelyet ez a tulajdonság vezérel, eltér attól az öröklési stílustól, amelyet a kulcsszavak és is a as kulcsszavak terveztek.
Relational operators
Az alábbi táblázat az X++-ban használható relációs operátorokat sorolja fel. A legtöbb operátor bináris, és két operandust vesz fel. A nem (!) operátor azonban unary, és csak egy operandust vesz igénybe. Bináris operátorok szintaxisa: kifejezés1relációsoperátorkifejezés2 A nem szereplő operátorok szintaxisa: relációsoperátorkifejezés1
| Operator | Description |
|---|---|
like |
A hasonló relációs operátor igaz értéket ad vissza, ha a kifejezés1 olyan, mint a kifejezés2. |
== |
Az egyenlő relációs operátor igaz értéket ad vissza, ha mindkét kifejezés egyenlő. |
>= |
A relációs operátor nagyobb vagy egyenlő értéke igaz , ha az 1. kifejezés nagyobb vagy egyenlő a kifejezés2-nél. |
<= |
A relációs operátor kisebb vagy egyenlő értéke igaz , ha a kifejezés1 kisebb vagy egyenlő a kifejezés2 értéknél. |
> |
A relációs operátornál nagyobbigaz értéket ad vissza, ha a kifejezés1 nagyobb, mint a kifejezés2. |
< |
A kisebb, mint relációs operátor igaz értéket ad vissza, ha a kifejezés1 kisebb, mint a kifejezés2. |
!= |
A nem egyenlő relációs operátor igaz értéket ad vissza, ha a kifejezés1 eltér (vagyis ha nem egyenlő) kifejezés2 kifejezéstől. |
&& |
A relációs operátorigaz értéket ad vissza, ha a kifejezés1 és a kifejezés2 is igaz. |
|| |
A vagy relációs operátor igaz értéket ad vissza, ha a kifejezés1 vagy a kifejezés2 igaz, vagy ha mindkettő igaz. |
! |
A nem vagy a nem relációs operátor tagadja a kifejezést. Igaz értéket ad vissza, ha a kifejezés hamis és hamis , ha a kifejezés igaz. |
A hasonló operátor
Az like operátor * használhat helyettesítő karakterként nulla vagy több karakterhez, egy ? karakterhez pedig helyettesítő karakterként. Az operandus maximális hossza 1000 karakter. Az like operátort az alapul szolgáló SQL értékeli ki, így az eredmény eltérő lehet a különböző telepítések esetében. Ha az összehasonlítandó kifejezések fájlelérési utat tartalmaznak, az egyes elemek között négy fordított perjelet kell tartalmaznia, ahogy az alábbi példában is látható.
select * from xRefpaths
where xRefPaths.Path like "\\\\Classes\\\\AddressSelectForm"
Az egyenlőség (==) operátor
Ha az egyenlő (==) operátorral hasonlítja össze az objektumokat, az objektumhivatkozások nem maguk az objektumok lesznek összehasonlítva. Ez a viselkedés problémákat okozhat, ha összehasonlít két objektumot, amelyek közül az egyik a kiszolgálón található, a másik pedig az ügyfélen található. Ezekben az esetekben az objektumosztályban az egyenlőségmetódust kell használnia. Ezt a metódust felülbírálhatja, így megadhatja, hogy mit jelent két objektum egyenlősége. Ha nem bírálja felül az egyenlőségmetódust, az összehasonlítás megegyezik az egyenlő () operátor által végzett összehasonlítással.==
Példakódok relációs operátorokra
"Jones" like "Jo?es" // Returns true, because the ? is equal to any single character.
"Fabrikam, Inc." like "Fa*" // Returns true, because the * is equal to zero or more characters.
(( 42 * 2) == 84) // Returns true, because 42*2 is equal to 84.
today() >= 1\1\1980 // Returns true, because today is later than January 1, 1980.
((11 div 10) >= 1) // Returns true, because 11 div 10 is 1 (therefore, >= 1 is true).
(11<= 12) // Returns true, because 11 is less than 12.
((11 div 10) > 1) // Returns false, because 11 div 10 is 1.
(11 div 10) < 1) // Returns false, because 11 div 10 is 1.
(11 != 12) // Returns true, because 11 is not equal to 12.
(1 == 1) && (3 > 1) // Returns true, because both expressions are true.
Operator precedence
Az összetett kifejezések kiértékelésének sorrendje fontos lehet. Például (x + y / 100) más eredményt ad attól függően, hogy az összeadás vagy az osztás az első. Zárójelek (()) használatával explicit módon megadhatja a fordítónak, hogyan értékeljen ki egy kifejezést. Például megadhatja a következőt: (x + y) / 100 Ha nem mondja meg explicit módon a fordítónak a műveletek elvégzésének sorrendjét, a sorrend az operátorokhoz rendelt elsőbbségen alapul. Az osztás operátora például nagyobb elsőbbséget élvez, mint az összeadási operátor. Ezért a kifejezés x + y / 100esetében a fordító először kiértékeli y / 100 . Más szóval, x + y / 100 egyenértékű a x + (y / 100). Annak érdekében, hogy a kód könnyen olvasható és karbantartható legyen, legyen explicit. Zárójelek használatával jelezheti, hogy mely operátorokat kell először kiértékelni. Az alábbi táblázat az operátorokat sorrendben sorolja fel. Minél magasabb egy operátor a táblában, annál nagyobb az előzménye. A magasabb elsőbbséget élvező operátorok kiértékelése az alacsonyabb elsőbbséget élvező operátorok előtt történik. Vegye figyelembe, hogy az X++ operátori elsőbbsége nem ugyanaz, mint a többi nyelv, például a C# és a Java operátori elsőbbsége.
| Operátorcsoportok, sorrendben | Operators |
|---|---|
| Unary | - ~ ! |
| Szorzó, shift, bitenként ÉS, bitenként exkluzív OR | * / % DIV << >> & ^ |
| Additív, bitenkénti befogadó VAGY | + - | |
| Relational, equality | < <= == != > >= like as is |
| Logikai (ÉSVAGY) |
&&
||
|
| Conditional | ? : |
Az ugyanazon a sorban lévő operátorok elsőbbséget élveznek. Ha egy kifejezés több operátort is tartalmaz, a rendszer balról jobbra értékeli, kivéve, ha hozzárendelési operátorokat használ. (A hozzárendelés-operátorok kiértékelése jobbról balra történik.) A (logikai) és && a (logikaiAND||) érték például OR ugyanazzal az előzményekkel rendelkezik, és a kiértékelése balról jobbra történik. Therefore:
-
0 && 0 || 1egyenlő1 -
1 || 0 && 0egyenlő .0