비고
커뮤니티 관심 그룹은 이제 Yammer에서 Microsoft Viva Engage로 이동했습니다. Viva Engage 커뮤니티에 가입하고 최신 토론에 참여하려면 Finance and Operations Viva Engage Community 양식에 대한 요청 액세스 권한을 작성하고 참여하려는 커뮤니티를 선택합니다.
이 문서에서는 X++에서 지원되는 연산자를 설명합니다.
대입 연산자
할당은 변수 또는 필드의 값을 변경합니다. 다음 표에서는 X++ 할당 연산자를 보여줍니다. 접두사와 접두사 연산자 간에는 차이가 없습니다.
| Operator | Description |
|---|---|
= |
등호 오른쪽에 있는 식을 왼쪽의 변수에 할당합니다. |
+= |
현재 변수 값과 오른쪽의 식을 왼쪽의 변수에 할당합니다. |
++ |
변수를 1씩 증분합니다. |
-= |
현재 변수 값에 오른쪽의 식을 뺀 값을 왼쪽의 변수에 할당합니다. |
-- |
변수를 1로 줄입니다. |
대입 연산자를 위한 코드 예제
// 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.
}
산술 연산자
산술 연산자를 사용하여 숫자 계산을 수행합니다. 대부분의 연산자는 이진이며 두 개의 피연산자를 사용합니다. 그러나 not (~) 연산자는 단항이며 하나의 피연산자만 사용합니다. 이진 연산자에 대한 구문: expression1ArithmeticOperatorexpression2 단항 연산자에 대한 구문: ArithmeticOperatorexpression1
| Operator | Description |
|---|---|
<< |
왼쪽 시프트 연산자는 expression1에서 expression2 왼쪽 시프트(곱하기 2)를 수행합니다. |
>> |
오른쪽 시프트 연산자는 expression1에서 expression2 오른쪽 시프트(2로 나누기)를 수행합니다. |
* |
곱하기 연산자는 expression1을 expression2로 곱합니다. |
/ |
divide 연산자는 expression1을 expression2로 나눕니다. |
DIV |
정수 나누기 연산자는 expression1의 정수 나누기를 expression2로 수행합니다. |
MOD |
정수 나머지 연산자는 expression1의 정수 나누기의 나머지 부분을 expression2로 반환합니다. |
~ |
not 연산자 또는 단항 연산자는 이진 not 연산을 수행합니다. |
& |
이진 AND 연산자는 expression1 및 expression2에서 이진 및 연산을 수행합니다. |
^ |
이진 XOR 연산자는 expression1 및 expression2에서 이진 XOR 연산을 수행합니다. |
| |
이진 OR 연산자는 expression1 및 expression2에서 이진 또는 연산을 수행합니다. |
+ |
더하기 연산자는 expression1을 expression2에 추가합니다. |
- |
minus 연산자는 expression1에서 expression2를 뺍니다. |
? |
3항 연산자는 expression1 ? expression2 : expression3. expression1이 true이면 expression2가 반환됩니다. 그렇지 않으면 expression3 이 반환됩니다. |
산술 연산자를 위한 코드 예제
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.
식 연산자
as 및 is 식 연산자는 다운캐스트 할당을 제어합니다. 다운캐스트 할당에는 클래스 또는 테이블 상속이 포함됩니다. 암시적으로 다운캐스트되는 할당 문은 예측 및 진단하기 어려운 오류를 일으킬 수 있습니다. 키워드를 as 사용하여 다운캐스트를 명시적으로 만들 수 있습니다. 키워드를 is 사용하여 런타임에 다운캐스트가 유효한지 테스트할 수 있습니다.
as 키워드
as 기본 클래스 변수에서 파생 클래스 변수로 다운캐스트하는 할당에 키워드를 사용합니다. 이 키워드는 as 다른 프로그래머와 컴파일러에게 런타임 중에 다운캐스트가 유효하다고 믿습니다.
- 컴파일러는 키워드가 없는
as다운캐스트 할당 문에 대한 오류를 보고합니다. - 런타임에 키워드는
as다운캐스트 할당 문이 유효하지 않은 경우 할당null하도록 합니다. - 이
is키워드는 키워드가 작동하는지 여부를 안전하게 테스트하는as데 자주 사용됩니다.
as 키워드에 대한 코드 예제
다음 코드 예제에서 DerivedClass 클래스는 BaseClass 클래스를 확장합니다. 코드 예제에는 basec 및 derivedc 변수 간에 두 개의 유효한 할당이 포함되어 있습니다.
basec에 대한 업캐스트 할당에는 키워드가 as 필요하지 않지만 derivedc에 대한 다운캐스트 할당에는 키워드가 as 필요합니다. 다음 코드는 오류 없이 컴파일 및 실행됩니다.
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 키워드
키워드는 is 개체가 지정된 클래스의 하위 형식인지 여부를 확인합니다. 개체가 is 클래스의 하위 형식이거나 개체가 클래스와 같은 형식이면 식이 true 를 반환합니다. 키워드 식이 두 형식을 비교하지만 두 형식이 다른 형식의 하위 형식이 아니고 형식이 같지 않으면 컴파일러에서 오류를 is 보고합니다. 컴파일러는 두 형식 간의 일반 할당 문에 대해 비슷한 오류를 보고합니다. 여기서 두 형식 모두 다른 형식의 하위 형식이 아니며 동일한 형식이 아닙니다. 런타임에 기본 개체를 참조하는 변수 형식은 키워드와 is 관련이 없습니다. 키 is 워드를 사용하면 시스템에서 개체를 참조하는 변수의 선언된 형식이 아니라 변수가 참조하는 개체를 확인합니다.
is 키워드에 대한 코드 예제
다음 코드 예제에서는 식이 is 또는 false를 반환하는지 여부를 제어하는 조건을 보여 줍니다. 코드 예제는 Form 클래스와 Query 클래스가 모두 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)));
is 및 as 키워드에 대한 코드 예제
다음 코드 예제에는 키워드의 일반적인 사용이 포함되어 있습니다 is .
as 키워드는 키워드가 is 성공한다는 것을 as 확인한 후에 사용됩니다. 이 예제에서 is 키워드와 as 키워드는 대문자로 표시되도록 합니다.
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.
특수 사례로 개체 클래스
개체 클래스는 상속 기능에서 특수한 사례로 나타날 수 있습니다. 컴파일러는 개체 형식으로 선언된 변수에 대한 형식 검사를 바이패스합니다. 일부 클래스는 Object 클래스에서 상속되고, 일부 클래스는 다른 클래스에서 상속되며, 일부 클래스는 클래스에서 상속되지 않습니다.
Dialog 클래스는 클래스에서 상속되지 않지만 다음 코드 예제의 할당 및 호출 문이 작동합니다. 그러나 할당이 있는 bank4 = dlog3;경우 은행 및 대화 상자 클래스는 서로 상속 관계가 없으므로 컴파일 시간에 실패합니다. 컴파일러는 Object 클래스로 선언된 변수에 대한 할당에 대해 하나의 작은 유효성 검사만 수행 합니다 . 컴파일러는 Object 변수에 할당되는 항목이 클래스의 인스턴스인지 확인합니다. 컴파일러는 테이블 버퍼의 인스턴스를 Object 변수에 할당할 수 없습니다. 또한 컴파일러는 int 변수에 할당되는 기본 데이터 형식(예: str 또는)을 허용하지 않습니다.
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
다른 테이블에서 명시적으로 상속하지 않는 한 모든 테이블은 공용 시스템 테이블에서 직접 상속됩니다. 공통 테이블은 인스턴스화할 수 없습니다. 기본 물리적 데이터베이스에는 존재하지 않습니다. Common 테이블은 xRecord 클래스에서 상속되지만 키워드 또는 is 키워드에 as 적합하지 않은 특수한 방식으로 상속됩니다. 키워드를 as 사용하여 테이블 간에 잘못된 다운캐스트를 수행하는 경우 대상 변수는 사용할 수 없는 null이 아닌 엔터티를 참조합니다. 대상 변수를 참조 해제하려고 하면 프로그램이 중지되는 오류가 발생합니다.
is 및 as 키워드 및 확장된 데이터 형식
확장된 각 데이터 형식에는 Extends 속성이 있습니다 . 이 속성이 제어하는 상속 스타일은 키워드 및 키워드가 디자인한 상속 is 스타일과 as 다릅니다.
관계형 연산자
다음 표에서는 X++에서 사용할 수 있는 관계형 연산자를 나열합니다. 대부분의 연산자는 이진이며 두 개의 피연산자를 사용합니다. 그러나 not (!) 연산자는 단항이며 하나의 피연산자만 사용합니다. 이진 연산자에 대한 구문: expression1relationalOperatorexpression2 단항 연산자에 대한 구문: relationalOperatorexpression1
| Operator | Description |
|---|---|
like |
expression1이 expression2와 같으면 like 관계형 연산자가 true를 반환합니다. |
== |
같음 관계형 연산자는 두 식이 같으면 true를 반환합니다. |
>= |
expression1이 expression2보다 크거나 같으면 관계형 연산자보다 크거나 같으면 true를 반환합니다. |
<= |
expression1이 expression2보다 작거나 같으면 관계형 연산자보다 작거나 같으면 true를 반환합니다. |
> |
expression1이 expression2보다 크면 관계형보다 큰 연산자는 true를 반환합니다. |
< |
expression1이 expression2보다 작으면 관계형보다 작은 연산자는 true를 반환합니다. |
!= |
식1이 다른 경우(즉, 같지 않은 경우) expression2가 true를 반환합니다. |
&& |
expression1과expression2가 모두 true이면 관계형 연산자는 true를 반환합니다. |
|| |
expression1 또는expression2가 true이거나 둘 다 true 인 경우 또는 관계형 연산자는 true를 반환합니다. |
! |
단항 관계형 연산자는 식을 부정합니다. 식이 false 이면 true를 반환하고 식이 true이면 false 를 반환합니다. |
Like 연산자
연산자는 like 0개 이상의 문자에 와일드카드 문자로, * 한 문자에 대해 와일드카드 문자로 사용할 ? 수 있습니다. 피연산자의 최대 길이는 1,000자입니다.
like 연산자는 기본 SQL에 의해 평가되므로 설치마다 결과가 다를 수 있습니다. 비교하는 식에 파일 경로가 포함된 경우 다음 예제와 같이 각 요소 사이에 4개의 백슬라이시를 포함해야 합니다.
select * from xRefpaths
where xRefPaths.Path like "\\\\Classes\\\\AddressSelectForm"
등호(==) 연산자
등호(==) 연산자를 사용하여 개체를 비교하면 개체 자체가 아니라 개체 참조가 비교됩니다. 이 동작은 두 개체를 비교하는 경우 문제가 발생할 수 있습니다. 그 중 하나는 서버에 있고 다른 하나는 클라이언트에 있습니다. 이러한 경우 Object 클래스에서 equal 메서드를 사용해야 합니다. 이 메서드를 재정의하여 두 개체의 의미를 지정할 수 있습니다.
등호 메서드를 재정의하지 않으면 비교는 등호(==) 연산자에 의해 수행되는 비교와 동일합니다.
관계형 연산자를 위한 코드 예제
"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.
연산자 우선 순위
복합 식이 계산되는 순서는 중요할 수 있습니다. 예를 들어 (x + y / 100) 더하기 또는 나누기가 먼저 수행되는지 여부에 따라 다른 결과를 제공합니다. 괄호(())를 사용하여 컴파일러에 식을 평가하는 방법을 명시적으로 알릴 수 있습니다. 예를 들어 .(x + y) / 100 컴파일러에 작업을 수행하려는 순서를 명시적으로 알리지 않으면 순서는 연산자에 할당된 우선 순위를 기반으로 합니다. 예를 들어 나누기 연산자는 더하기 연산자보다 우선 순위가 높습니다. 따라서 식 x + y / 100의 경우 컴파일러가 먼저 계산됩니다 y / 100 . 즉, x + y / 100 입니다 x + (y / 100). 코드를 쉽게 읽고 유지 관리하려면 명시적이어야 합니다. 괄호를 사용하여 먼저 평가해야 하는 연산자를 나타냅니다. 다음 표에서는 우선 순위에 따라 연산자를 나열합니다. 테이블에 연산자가 나타날수록 우선 순위가 높습니다. 우선 순위가 더 높은 연산자는 우선 순위가 낮은 연산자보다 먼저 평가됩니다. X++의 연산자 우선 순위는 C# 및 Java와 같은 다른 언어의 연산자 우선 순위와 동일하지 않습니다.
| 우선 순위에 따라 연산자 그룹 | 운영자 |
|---|---|
| 단항 | - ~ ! |
| 곱하기, 시프트, 비트 AND, 비트 배타 적 OR | * / % DIV << >> & ^ |
| 가산, 비트 포함 OR | + - | |
| 관계형, 같음 | < <= == != > >= like as is |
| 논리(AND, OR) |
&&
||
|
| Conditional | ? : |
같은 줄의 연산자는 동일한 우선 순위를 갖습니다. 식에 이러한 연산자가 둘 이상 포함된 경우 할당 연산자를 사용하지 않는 한 왼쪽에서 오른쪽으로 평가됩니다. (할당 연산자는 오른쪽에서 왼쪽으로 평가됩니다.) 예를 들어 && (논리적 AND) 및 || (논리적 OR)는 동일한 우선 순위를 가지며 왼쪽에서 오른쪽으로 평가됩니다. Therefore:
-
0 && 0 || 1가 같음1 -
1 || 0 && 0가 같음0