Operator X++

Note

Grup minat komunitas sekarang telah berpindah dari Yammer ke Microsoft Viva Engage. Untuk bergabung dengan komunitas Viva Engage dan mengambil bagian dalam diskusi terbaru, isi Request akses ke Komunitas Viva Engage Keuangan dan Operasi dan pilih komunitas yang ingin Anda gabungkan.

Artikel ini menjelaskan operator yang didukung di X++.

Operator Penugasan

Operator penugasan mengubah nilai variabel atau bidang. Tabel berikut ini memperlihatkan operator penugasan X++. Tidak ada perbedaan antara operator awalan dan postfix.

Operator Description
= Tetapkan ekspresi di sebelah kanan tanda sama dengan variabel di sebelah kiri.
+= Tetapkan nilai variabel saat ini ditambah ekspresi di sebelah kanan ke variabel di sebelah kiri.
++ Menaikkan variabel dengan 1.
-= Tetapkan nilai variabel saat ini dikurangi ekspresi di sebelah kanan ke variabel di sebelah kiri.
-- Dekremen variabel dengan 1.

Contoh kode untuk operator penugasan

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

Operasi Aritmatika

Gunakan operator aritmatika untuk melakukan perhitungan numerik. Sebagian besar operator adalah biner dan mengambil dua operand. Namun, operator bukan (~) adalah unary dan hanya mengambil satu operand. Sintaks untuk operator biner: ekspresi1Sintaks ekspresi AritmeticOperator2 untuk operator unary: Ekspresi AritmeticOperator1

Operator Description
<< Operator shift kiri melakukan shift kiri ekspresi2 (perkalian dengan 2) pada ekspresi1.
>> Operator shift kanan melakukan shift kanan ekspresi2 (pembagian sebesar 2) pada ekspresi1.
* Operator kalikan mengalikanekspresi1 dengan ekspresi2.
/ Operator pembagi membagi ekspresi1 dengan ekspresi2.
DIV Operator pembagian bilangan bulat melakukan pembagian bilangan bulat ekspresi1 dengan ekspresi2.
MOD Operator sisa bilangan bulat mengembalikan sisa pembagian bilangan bulat ekspresi1 menurut ekspresi2.
~ Operator bukan , atau operator unary, melakukan operasi biner not.
& Operator BINER AND melakukan biner dan operasi pada ekspresi1 dan ekspresi2.
^ Operator XOR biner melakukan operasi XOR biner pada ekspresi1 dan ekspresi2.
| Operator OR biner melakukan biner atau operasi pada ekspresi1 dan ekspresi2.
+ Operator plus menambahkan ekspresi1 ke ekspresi2.
- Operator minus mengurangi ekspresi2 dari ekspresi1.
? Operator terner mengambil tiga ekspresi: ekspresi1 ? expression2 : expression3. Jika ekspresi1 benar, ekspresi2 dikembalikan. Jika tidak, ekspresi3 dikembalikan.

Contoh kode untuk operator aritmatika

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.

Operator ekspresi

Operator as ekspresi dan is mengontrol penugasan downcast. Penugasan downcast melibatkan pewarisan kelas atau tabel. Pernyataan penugasan yang secara implisit menurun dapat menyebabkan kesalahan yang sulit diprediksi dan didiagnosis. as Gunakan kata kunci untuk membuat downcast Anda eksplisit. is Gunakan kata kunci untuk menguji apakah downcast valid pada waktu proses.

Kata kunci sebagai

as Gunakan kata kunci untuk penugasan yang menurun dari variabel kelas dasar ke variabel kelas turunan. Kata as kunci memberi tahu pemrogram lain dan pengkompilasi bahwa Anda percaya bahwa downcast valid selama run time.

  • Pengkompilasi melaporkan kesalahan untuk pernyataan penugasan downcast yang tidak memiliki as kata kunci.
  • Pada run time, as kata kunci menyebabkan pernyataan penugasan downcast ditetapkan null jika downcast tidak valid.
  • is Gunakan kata kunci untuk menguji dengan aman apakah as kata kunci berfungsi.

Contoh kode untuk kata kunci sebagai

Dalam contoh kode berikut, kelas DerivedClass memperluas kelas BaseClass . Contoh kode berisi dua penugasan yang valid antara variabel basec dan turunannya . Penetapan upcast ke basec tidak memerlukan as kata kunci, tetapi penugasan downcast untuk turunan memang memerlukan as kata kunci. Kode berikut mengkompilasi dan berjalan tanpa kesalahan.

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

adalah kata kunci

Kata is kunci memverifikasi apakah objek adalah subjenis dari kelas tertentu. Ekspresi is mengembalikan true jika objek adalah subjenis kelas, atau jika objek adalah jenis yang sama dengan kelas. Pengkompilasi melaporkan kesalahan jika is ekspresi kata kunci membandingkan dua jenis, tetapi tidak ada jenis yang merupakan subjenis dari yang lain, dan bukan tipe yang sama. Pengkompilasi melaporkan kesalahan serupa untuk pernyataan penetapan biasa antara dua jenis, di mana tidak ada jenis yang merupakan subjenis dari yang lain, dan tidak memiliki jenis yang sama. Pada waktu proses, jenis variabel yang mereferensikan objek yang mendasarinya tidak relevan dengan is kata kunci. Kata is kunci menyebabkan sistem memverifikasi objek yang direferensikan variabel, bukan jenis variabel yang dideklarasikan yang mereferensikan objek.

Contoh kode untuk adalah kata kunci

Contoh kode berikut mengilustrasikan kondisi yang mengontrol apakah is ekspresi mengembalikan true atau false. Contoh kode bergantung pada fakta bahwa kelas Formulir dan kelas Kueri keduanya memperluas kelas TreeNode .

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

Contoh kode untuk adalah dan sebagai kata kunci

Contoh kode berikut berisi penggunaan kata kunci yang is khas. Kata as kunci digunakan setelah is kata kunci memverifikasi bahwa as kata kunci berhasil. Dalam contoh ini, is kata kunci dan as adalah huruf besar untuk membuatnya lebih terlihat.

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.

Kelas objek sebagai kasus khusus

Kelas Objek dapat muncul sebagai kasus khusus dalam fungsionalitas warisan. Jenis bypass kompilator memeriksa penugasan ke dan dari variabel yang dinyatakan berjenis Objek. Beberapa kelas mewarisi dari kelas Objek , beberapa kelas mewarisi dari kelas lain, dan beberapa kelas tidak mewarisi dari kelas apa pun. Meskipun kelas Dialog tidak mewarisi dari kelas apa pun, pernyataan penugasan dan panggilan dalam contoh kode berikut berfungsi. Namun, jika penugasan adalah bank4 = dlog3;, itu akan gagal pada waktu kompilasi, karena kelas Bank dan Dialog tidak memiliki hubungan warisan satu sama lain. Pengkompilasi hanya melakukan satu validasi kecil pada penugasan ke variabel yang dinyatakan berada di kelas Objek . Pengkompilasi memverifikasi bahwa item yang ditetapkan ke variabel Objek adalah instans kelas. Pengkompilasi tidak mengizinkan instans buffer tabel ditetapkan ke variabel Objek . Selain itu, pengompilasi tidak mengizinkan jenis data primitif, seperti int atau str, untuk ditetapkan ke variabel Objek .

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

Semua tabel mewarisi langsung dari tabel Sistem umum, kecuali tabel tersebut secara eksplisit mewarisi dari tabel yang berbeda. Tabel Umum tidak dapat dibuat instansnya. Ini tidak ada di database fisik yang mendasar. Tabel Umum mewarisi dari kelas xRecord , tetapi dengan cara khusus yang tidak sesuai untuk is kata kunci atau as kata kunci. as Ketika kata kunci digunakan untuk melakukan downcast yang tidak valid di antara tabel, variabel target mereferensikan entitas non-null yang tidak dapat digunakan. Setiap upaya untuk membatalkan referensi variabel target akan menyebabkan kesalahan yang menghentikan program.

adalah dan sebagai kata kunci dan jenis data yang diperluas

Setiap jenis data yang diperluas memiliki properti Extends . Gaya pewarisan yang dikontrol properti ini berbeda dari gaya warisan yang is dirancang untuk kata kunci dan as .

Operator relasional

Tabel berikut mencantumkan operator relasional yang dapat digunakan di X++. Sebagian besar operator adalah biner dan mengambil dua operand. Namun, operator bukan (!) adalah unary dan hanya mengambil satu operand. Sintaks untuk operator biner: ekspresi1relationalOperatorexpression2 Sintaks untuk operator unary: relationalOperatorexpression1

Operator Description
like Operator relasional seperti mengembalikan true jika ekspresi1 seperti ekspresi2.
== Operator relasional yang sama mengembalikan true jika kedua ekspresi sama.
>= Operator yang lebih besar dari atau sama dengan relasional mengembalikan true jika ekspresi1 lebih besar dari atau sama dengan ekspresi2.
<= Operator relasional kurang dari atau sama dengan mengembalikan true jika ekspresi1 kurang dari atau sama dengan ekspresi2.
> Operator yang lebih besar dari relasional mengembalikan true jika ekspresi1 lebih besar dari ekspresi2.
< Operator kurang dari relasional mengembalikan true jika ekspresi1 kurang dari ekspresi2.
!= Operator relasional yang tidak sama mengembalikan true jika ekspresi1 berbeda dari (yaitu, jika tidak sama dengan) ekspresi2.
&& Operator dan relasional mengembalikan true jika ekspresi1 dan ekspresi2 benar.
|| Operator atau relasional mengembalikan true jika ekspresi1 atau ekspresi2 benar, atau jika keduanya benar.
! Operator relasional bukan atau tidak meniadakan ekspresi. Ini mengembalikan true jika ekspresi salah dan salah jika ekspresinya benar.

Operator sesuka

Operator like dapat menggunakan * sebagai karakter kartubebas untuk nol karakter atau lebih, dan ? sebagai karakter kartubebas untuk satu karakter. Panjang maksimum operand adalah 1.000 karakter. Operator like dievaluasi oleh SQL yang mendasar, sehingga hasilnya mungkin berbeda pada penginstalan yang berbeda. Jika ekspresi yang Anda bandingkan berisi jalur file, Anda harus menyertakan empat garis miring terbalik di antara setiap elemen, seperti yang ditunjukkan dalam contoh berikut.

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

Operator sama dengan (==)

Saat Anda menggunakan operator yang sama (==) untuk membandingkan objek, referensi objek dibandingkan, bukan objek itu sendiri. Perilaku ini dapat menyebabkan masalah jika Anda membandingkan dua objek, salah satunya terletak di server, dan yang lainnya terletak di klien. Dalam kasus ini, Anda harus menggunakan metode yang sama di kelas Objek . Anda dapat mengambil alih metode ini untuk menentukan apa artinya bagi dua objek agar sama. Jika Anda tidak mengambil alih metode yang sama , perbandingannya identik dengan perbandingan yang dilakukan oleh operator yang sama (==).

Contoh kode untuk operator relasional

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

Prioritas operator

Urutan ekspresi gabungan dievaluasi bisa menjadi penting. Misalnya, (x + y / 100) memberikan hasil yang berbeda, tergantung pada apakah penambahan atau pembagian dilakukan terlebih dahulu. Anda dapat menggunakan tanda kurung (()) untuk secara eksplisit memberi tahu pengkompilasi bagaimana harus mengevaluasi ekspresi. Misalnya, Anda dapat menentukan (x + y) / 100. Jika Anda tidak secara eksplisit memberi tahu pengkompilasi urutan operasi yang ingin Anda lakukan, urutan didasarkan pada prioritas yang ditetapkan ke operator. Misalnya, operator divisi memiliki prioritas yang lebih tinggi daripada operator penambahan. Oleh karena itu, untuk ekspresi x + y / 100, pengkompilasi mengevaluasi y / 100 terlebih dahulu. Dengan kata lain, x + y / 100 setara dengan x + (y / 100). Untuk membuat kode Anda mudah dibaca dan dirawat, jadilah eksplisit. Gunakan tanda kurung untuk menunjukkan operator mana yang harus dievaluasi terlebih dahulu. Tabel berikut mencantumkan operator dalam urutan prioritas. Semakin tinggi operator muncul dalam tabel, semakin tinggi prioritasnya. Operator yang memiliki prioritas lebih tinggi dievaluasi sebelum operator yang memiliki prioritas lebih rendah. Perhatikan bahwa operator prioritas X++ tidak sama dengan prioritas operator bahasa lain, seperti C# dan Java.

Grup operator, dalam urutan prioritas Operators
Unari - ~ !
Multiplikatif, shift, bitwise AND, bitwise eksklusif OR * / % DIV << >> & ^
Aditif, bitwise inklusif OR + - |
Relasional, kesetaraan < <= == != > >= like as is
Logis (AND, OR) && ||
Bersyarat ? :

Operator pada baris yang sama memiliki prioritas yang sama. Jika ekspresi menyertakan lebih dari salah satu operator ini, ekspresi dievaluasi dari kiri ke kanan, kecuali operator penugasan digunakan. (Operator penugasan dievaluasi dari kanan ke kiri.) Misalnya, && (logis AND) dan || (logis OR) memiliki prioritas yang sama, dan dievaluasi dari kiri ke kanan. Therefore:

  • 0 && 0 || 1 sama dengan 1
  • 1 || 0 && 0 sama dengan 0.