X++ operators

Bu makalede X++'ta desteklenen işleçler açıklanmaktadır.

Assignment operators

Atama işleci bir değişkenin veya alanın değerini değiştirir. Aşağıdaki tabloda X++ atama işleçleri gösterilmektedir. Ön ek ve sonek işleçleri arasında fark yoktur.

Operator Description
= Eşittir işaretinin sağındaki ifadeyi soldaki değişkene atayın.
+= Geçerli değişken değerini ve sağdaki ifadeyi soldaki değişkene atayın.
++ Değişkeni 1 artır.
-= Geçerli değişken değerini sağdaki ifadeden çıkararak soldaki değişkene atayın.
-- Değişkeni 1'e kadar azaltma.

Atama işleçleri için kod örnekleri

// 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

Sayısal hesaplamalar yapmak için aritmetik işleçler kullanın. İşleçlerin çoğu ikilidir ve iki işlenen alır. Ancak not (~) işleci teklidir ve yalnızca bir işlenen alır. İkili işleçler için sözdizimi: ifade1AritmetikOperatorifadesi2 Tekli işleçler için söz dizimi: AritmetikOperatorifadesi1

Operator Description
<< Sol shift işleci, ifade1 üzerinde ifade2 sol kaydırma (2'ye göre çarpma) gerçekleştirir.
>> Sağ shift işleci, ifade1 üzerinde ifade2 sağ kaydırma (2'ye göre bölme) gerçekleştirir.
* Çarpma işleci ifade1'i ifade2 ile çarpar.
/ Bölme işleci ifade1'iifade2'ye böler.
DIV Tamsayı bölme işleci, ifade1'inifade2'ye göre tamsayı bölme işlemini gerçekleştirir.
MOD Kalan tamsayı işleci, ifade1'inifade2'ye göre tamsayı bölümünün geri kalanını döndürür.
~ not işleci veya birli işleç, ikili değil işlemi gerçekleştirir.
& İkili AND işleci, ifade1 ve ifade2 üzerinde bir ikili ve işlem gerçekleştirir.
^ İkili XOR işleci, ifade1 ve ifade2 üzerinde bir ikili XOR işlemi gerçekleştirir.
| İkili OR işleci, ifade1 ve ifade2 üzerinde bir ikili veya işlem gerçekleştirir.
+ artı işleci expression1'iexpression2'ye ekler.
- eksi işleci ifade2'yiifade1'den çıkarır.
? Üçüncül işleç üç ifade alır: ifade1 ? ifade2 : ifade3. İfade1 true ise, ifade2 döndürülür. Aksi takdirde , ifade3 döndürülür.

Aritmetik işleçler için kod örnekleri

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

as ve is ifade işleçleri, aşağı yayın atamalarını denetler. Aşağı yayın atamaları sınıf veya tablo devralmayı içerir. Örtük olarak aşağı yayına alınan atama deyimleri tahmin etmek ve tanılamak zor olan hatalara neden olabilir. Downcasts açık yapmak için anahtar sözcüğünü as kullanın. Çalışma zamanında aşağı yayının is geçerli olup olmadığını test etmek için anahtar sözcüğünü kullanın.

As anahtar sözcüğü

as Temel sınıf değişkeninden türetilmiş bir sınıf değişkenine aşağı yayınlayan atamalar için anahtar sözcüğünü kullanın. as anahtar sözcüğü, diğer programcılara ve derleyiciye çalışma zamanında aşağı yayının geçerli olduğuna inandığınızı bildirir.

  • Derleyici, anahtar sözcüğü olmayan as downcast atama deyimleri için bir hata bildirir.
  • Çalışma zamanında anahtar sözcüğü, as downcast atama deyiminin downcast geçerli değilse atamasına null neden olur.
  • Anahtar sözcüğün is çalışıp çalışmadığını güvenli bir şekilde test etmek için anahtar sözcüğünü as kullanın.

as anahtar sözcüğü için kod örneği

Aşağıdaki kod örneğinde DerivedClass sınıfı BaseClass sınıfını genişletir. Kod örneği , basec ve derivedc değişkenleri arasında iki geçerli atama içerir. Basec'e yapılan yukarı yayın ataması as anahtar sözcüğü gerektirmez, ancak türetilmişc'e yapılan aşağı yayın ataması anahtar sözcüğü gerektiriras. Aşağıdaki kod derler ve hatasız çalışır.

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;
}

is anahtar sözcüğü

anahtar is sözcüğü, bir nesnenin belirtilen sınıfın alt türü olup olmadığını doğrular. is nesnesi sınıfın bir alt türüyse veya nesne sınıfıyla aynı türdeyse ifade true döndürür. Derleyici, bir is anahtar sözcük ifadesi iki türü karşılaştırırsa, ancak iki tür de diğerinin alt türü değilse ve aynı türde değilse bir hata bildirir. Derleyici, iki tür arasındaki herhangi bir düz atama deyimi için benzer bir hata bildirir; burada türlerden hiçbiri diğerinin alt türü değildir ve aynı türde değildir. Çalışma zamanında, temel alınan nesneye başvuran değişkenin türü anahtar sözcükle is ilgisizdir. is anahtar sözcüğü, sistemin değişkenin başvurduğunu nesneyi doğrulamasına neden olur, nesneye başvuran değişkenin bildirilen türüne değil.

için kod örnekleri: anahtar sözcük

Aşağıdaki kod örnekleri, bir is ifadenin true veya false döndürdüğünü denetleen koşulları gösterir. Kod örnekleri , Hem Form sınıfının hem de Query sınıfının TreeNode sınıfını genişletmesine bağlıdır.

// 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)));

için kod örneği: ve anahtar sözcük olarak

Aşağıdaki kod örneği, anahtar sözcüğün is tipik bir kullanımını içerir. as anahtar sözcüğü, anahtar sözcüğün is başarılı olduğunu as doğruladıktan sonra kullanılır. Bu örnekte ve isas anahtar sözcükleri daha görünür hale getirmek için büyük harftir.

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.

Özel durum olarak nesne sınıfı

Object sınıfı, devralma işlevinde özel bir durum olarak görünebilir. Derleyici, Object türünde olduğu bildirilen değişkenlere ve değişkenlerden atamalar için tür denetimini atlar. Bazı sınıflar Object sınıfından devralır, bazı sınıflar başka bir sınıftan devralır ve bazı sınıflar herhangi bir sınıftan devralınır. dialog sınıfı herhangi bir sınıftan devralmasa da, aşağıdaki kod örneğindeki atama ve çağrı deyimleri çalışır. Ancak atama ise bank4 = dlog3;, Bank ve Dialog sınıflarının birbirleriyle devralma ilişkisi olmadığından derleme zamanında başarısız olur. Derleyici, Object sınıfından olduğu bildirilen bir değişkene yapılan atamalarda yalnızca bir küçük doğrulama gerçekleştirir. Derleyici, Object değişkenine atanan öğenin bir sınıfın örneği olduğunu doğrular. Derleyici, bir tablo arabelleği örneğinin Object değişkenine atanmasına izin vermez. Ayrıca, derleyici veya intgibi str ilkel veri türlerinin Object değişkenine atanmasına izin vermez.

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

Açıkça farklı bir tablodan devralmadıkları sürece tüm tablolar doğrudan Common sistem tablosundan devralır. Ortak tablo örneği oluşturulamaz. Temel alınan fiziksel veritabanında yok. Common tablosu xRecord sınıfından devralınır, ancak anahtar sözcük veya is anahtar sözcük için as uygun olmayan özel bir şekilde. as Tablolar arasında geçersiz bir aşağı yayın gerçekleştirmek için anahtar sözcük kullanıldığında, hedef değişken kullanılamaz bir null olmayan varlığa başvurur. Hedef değişkene başvuruyu kaldırma girişimi, programı durduran bir hataya neden olur.

is ve as anahtar sözcükleri ve genişletilmiş veri türleri

Her genişletilmiş veri türünün bir Extends özelliği vardır. Bu özelliğin denetlediğini devralma stili, ve is anahtar sözcüklerinin tasarlandığı devralma as stilinden farklıdır.

Relational operators

Aşağıdaki tabloda X++ dilinde kullanılabilecek ilişkisel işleçler listelenmiştir. İşleçlerin çoğu ikilidir ve iki işlenen alır. Ancak not (!) işleci teklidir ve yalnızca bir işlenen alır. İkili işleçler için sözdizimi: ifade1ilişkiselOperatorifadesi2 Tekli işleçler için söz dizimi: relationalOperatorifadesi1

Operator Description
like like ilişkisel işleci, ifade1 ifade2 gibiyse true döndürür.
== her iki ifade de eşitse eşit ilişkisel işleç true döndürür.
>= İfade1ifade2'denbüyük veya buna eşitse, büyüktür veya eşittir işleci true döndürür.
<= İfade1 ifade2'denküçük veya buna eşitse, ilişkisel işleçten küçük veya buna eşit olan true değerini döndürür.
> büyüktür ilişkisel işleci, ifade1ifade2'den büyükse true döndürür.
< İfade1ifade2'den küçükse küçüktür ilişkisel işleç true döndürür.
!= eşit olmayan ilişkisel işleç, ifade1ifade2'den farklıysa (yani, eşit değilse) true döndürür.
&& hem ifade1 hem de ifade2doğruysave ilişkisel işleci true döndürür.
|| veya ilişkisel işleç, ifade1 veya ifade2doğruysa veya her ikisi de doğruysa true döndürür.
! Not veya birli ilişkisel işleç ifadeyi olumsuzlar. İfade false ise true , ifade true ise false döndürür.

like işleci

işleci sıfır like veya daha fazla karakter için joker karakter ve * bir karakter için joker karakter olarak kullanabilir?. İşlenenin uzunluk üst sınırı 1.000 karakterdir. İşleç like , temel alınan SQL tarafından değerlendirilir, bu nedenle sonuç farklı yüklemelerde farklılık gösterebilir. Karşılaştırdığınız ifadeler bir dosya yolu içeriyorsa, aşağıdaki örnekte gösterildiği gibi her öğeye dört ters eğik çizgi eklemeniz gerekir.

select * from xRefpaths
where xRefPaths.Path like "\\\\Classes\\\\AddressSelectForm"

equal (==) işleci

Nesneleri karşılaştırmak için eşittir (==) işlecini kullandığınızda, nesne başvuruları nesnelerin kendileri değil, karşılaştırılır. Biri sunucuda, diğeri istemcide bulunan iki nesneyi karşılaştırırsanız bu davranış sorunlara neden olabilir. Bu gibi durumlarda, Object sınıfında equal yöntemini kullanmanız gerekir. İki nesnenin eşit olması için ne anlama geldiğini belirtmek için bu yöntemi geçersiz kılabilirsiniz. Eşittir yöntemini geçersiz kılmazsanız, karşılaştırma eşittir (==) işleci tarafından yapılan karşılaştırmayla aynıdır.

İlişkisel işleçler için kod örnekleri

"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

Bileşik ifadenin değerlendirileceği sıra önemli olabilir. Örneğin, (x + y / 100) toplamanın mı yoksa bölmenin önce mi yapıldığına bağlı olarak farklı bir sonuç verir. Derleyiciye ifadeyi nasıl değerlendirmesi gerektiğini açıkça söylemek için parantezleri (()) kullanabilirsiniz. Örneğin, belirtebilirsiniz (x + y) / 100. Derleyiciye işlemlerin yapılmasını istediğiniz sırayı açıkça belirtmezseniz, sıra işleçlere atanan önceliğe bağlıdır. Örneğin, bölme işleci toplama işlecinden daha yüksek önceliğe sahiptir. Bu nedenle, ifadesi x + y / 100için derleyici önce değerlendirir y / 100 . Başka bir deyişle, x + y / 100 ile x + (y / 100)eşdeğerdir. Kodunuzun okunmasını ve bakımını kolaylaştırmak için açık olun. Önce hangi işleçlerin değerlendirilmesi gerektiğini belirtmek için parantezleri kullanın. Aşağıdaki tabloda işleçler öncelik sırasına göre listelenmiştir. Tabloda bir işleç ne kadar yüksek olursa, önceliği o kadar yüksek olur. Daha yüksek önceliğe sahip işleçler, daha düşük önceliğe sahip işleçlerden önce değerlendirilir. X++'ın işleç önceliği, C# ve Java gibi diğer dillerin işleç önceliğiyle aynı değildir.

İşleç grupları, öncelik sırasına göre Operators
Unary - ~ !
Çarpımlı, shift, bit tabanlı VE, bit tabanlı özel OR * / % DIV << >> & ^
Eklemeli, bit düzeyinde dahil OR + - |
Relational, equality < <= == != > >= like as is
Mantıksal (VE, VEYA) && ||
Conditional ? :

Aynı satırdaki işleçler eşit önceliğe sahiptir. Bir ifade bu işleçlerden birden fazlasını içeriyorsa, atama işleçleri kullanılmadığı sürece soldan sağa değerlendirilir. (Atama işleçleri sağdan sola değerlendirilir.) Örneğin, && (mantıksal AND) ve || (mantıksal OR) aynı önceliğe sahiptir ve soldan sağa değerlendirilir. Therefore:

  • 0 && 0 || 1 eşittir 1
  • 1 || 0 && 0 0eşittir.