C# 연산자 및 식

C#은 여러 연산자를 제공합니다. 상당수의 연산자는 기본 제공 형식에서 지원되며 해당 형식의 값을 사용하여 기본 연산을 수행할 수 있습니다. 해당 연산자는 다음 그룹을 포함합니다.

일반적으로 이 연산자들을 오버로드할 수 있습니다. 즉, 사용자 정의 형식의 피연산자에 대한 연산자 동작을 지정할 수 있습니다.

가장 간단한 C# 식은 리터럴(예: 정수실수) 및 변수 이름입니다. 연산자를 사용하여 이들을 복잡한 식으로 결합할 수 있습니다. 연산자 우선 순위결합성은 식에서 연산이 수행되는 순서를 결정합니다. 괄호를 사용하여 연산자 우선 순위 및 결합성에 따라 주어진 계산 순서를 변경할 수 있습니다.

다음 코드에서 식의 예는 할당의 오른쪽에 있습니다.

int a, b, c;
a = 7;
b = a;
c = b++;
b = a + b * c;
c = a >= 100 ? b : c / 10;
a = (int)Math.Sqrt(b * b + c * c);

string s = "String literal";
char l = s[s.Length - 1];

List<int> numbers = [..collection];
b = numbers.FindLast(n => n > 1);

일반적으로 식은 결과를 생성하고 다른 식에 포함될 수 있습니다. void 메서드 호출은 결과를 생성하지 않는 식의 예입니다. 다음 예에 나와 있는 것처럼 이 메서드 호출은 으로만 사용할 수 있습니다.

Console.WriteLine("Hello, world!");

C#에서 제공하는 몇 가지 다른 종류의 식은 다음과 같습니다.

  • 보간된 문자열 식: 다음과 같이 형식 문자열을 만들 수 있는 편리한 구문을 제공합니다.

    var r = 2.3;
    var message = $"The area of a circle with radius {r} is {Math.PI * r * r:F3}.";
    Console.WriteLine(message);
    // Output:
    // The area of a circle with radius 2.3 is 16.619.
    
  • 람다 식: 다음과 같이 익명 함수를 만들 수 있습니다.

    int[] numbers = { 2, 3, 4, 5 };
    var maximumSquare = numbers.Max(x => x * x);
    Console.WriteLine(maximumSquare);
    // Output:
    // 25
    
  • 쿼리 식: 다음과 같이 C#에서 직접 쿼리 기능을 사용할 수 있습니다.

    int[] scores = { 90, 97, 78, 68, 85 };
    IEnumerable<int> highScoresQuery =
        from score in scores
        where score > 80
        orderby score descending
        select score;
    Console.WriteLine(string.Join(" ", highScoresQuery));
    // Output:
    // 97 90 85
    

식 본문 정의를 사용하여 메서드, 생성자, 속성, 인덱서 또는 종료자에 대한 간결한 정의를 제공할 수 있습니다.

연산자 우선 순위

여러 연산자가 있는 식에서 우선 순위가 높은 연산자는 연산자가 우선 순위가 낮은 연산자보다 먼저 계산됩니다. 다음 예제에서는 곱하기가 더하기보다 높은 우선 순위를 가지므로 곱하기가 먼저 수행됩니다.

var a = 2 + 2 * 2;
Console.WriteLine(a); //  output: 6

괄호를 사용하여 연산자 우선 순위에 따라 주어진 계산 순서를 변경합니다.

var a = (2 + 2) * 2;
Console.WriteLine(a); //  output: 8

다음 표에서는 우선순위가 가장 높은 것부터 시작하여 순서대로 C# 연산자를 나열합니다. 각 행 내의 연산자는 우선 순위가 같습니다.

연산자 범주 또는 이름
x.y, f(x), a[i], x?.y, x?[y], x++, x--, x!, new, typeof, checked, unchecked, default, nameof, delegate, sizeof, stackalloc, x->y 기본 항목
+x, -x, !x, ~x, ++x, --x, ^x, (T)x, await, &x, *x, true 및 false 단항
x..y 범위
switch, with switchwith
x * y, x / y, x % y 곱하기
x + y, x – y 더하기
x << y, x >> y, x >>> y Shift
x < y, x > y, x <= y, x >= y, is, as 관계형 및 형식 테스트
x == y, x != y Equality
x & y 부울 논리 AND 또는 비트 논리 AND
x ^ y 부울 논리 XOR 또는 비트 논리 XOR
x | y OR 또는 비트 논리 OR
x && y 조건부 AND
x || y 조건부 OR
x ?? y Null 병합 연산자
c ? t : f 조건 연산자
x = y, x += y, x -= y, x *= y, x /= y, x %= y, x &= y, x |= y, x ^= y, x <<= y, x >>= y, x >>>= y, x ??= y, => 할당 및 람다 선언

논리적 패턴 결합자의 우선 순위에 대한 자세한 내용은 패턴 문서의 논리적 패턴 검사의 우선 순위 및 순서 섹션을 참조하세요.

연산자 결합성

연산자의 우선 순위가 같은 경우 연산자의 결합성이 연산이 수행되는 순서를 결정합니다.

  • ‘왼쪽 결합성이 있는’ 연산자는 왼쪽에서 오른쪽으로 계산됩니다. 대입 연산자null 병합 연산자 를 제외하고, 모든 이진 연산자는 왼쪽 결합성이 있습니다. 예를 들어, a + b - c(a + b) - c로 계산됩니다.
  • ‘오른쪽 결합성이 있는’ 연산자는 오른쪽에서 왼쪽으로 계산됩니다. 대입 연산자, null 병합 연산자, 람다 및 조건 연산자 ?:는 오른쪽 결합성이 있습니다. 예를 들어, x = y = zx = (y = z)로 계산됩니다.

Important

P?.A0?.A1 형식의 식에서 Pnull이면, A0 또는 A1 둘 다 평가되지 않습니다. 마찬가지로 P?.A0.A1 형식의 식에서 P가 null일 때 A0은 평가되지 않으므로 A0.A1도 평가되지 않습니다. 자세한 내용은 C# 언어 사양을 참조하세요.

괄호를 사용하여 연산자 결합성에 따라 주어진 계산 순서를 변경합니다.

int a = 13 / 5 / 2;
int b = 13 / (5 / 2);
Console.WriteLine($"a = {a}, b = {b}");  // output: a = 1, b = 6

피연산자 계산

연산자 우선 순위 및 결합성과 관계없이 식의 피연산자는 왼쪽에서 오른쪽으로 계산됩니다. 다음 예제는 연산자와 피연산자가 계산되는 순서를 보여 줍니다.

계산 순서
a + b a, b, +
a + b * c a, b, c, *, +
a / b + c * d a, b, /, c, d, *, +
a / (b + c) * d a, b, c, +, /, d, *

일반적으로 모든 연산자 피연산자가 계산됩니다. 그러나 일부 연산자는 조건부로 피연산자를 계산합니다. 즉, 이와 같은 연산자의 첫 번째 피연산자 값이 다른 피연산자를 계산해야 할지 여부 또는 계산해야 할 다른 피연산자를 정의합니다. 이에 해당하는 연산자는 조건부 논리 AND(&&)OR(||) 연산자, null 병합 연산자 ????=, null 조건부 연산자 ?.?[], 그리고 조건 연산자 ?:입니다. 자세한 내용은 각 연산자에 관한 설명을 참조하세요.

C# 언어 사양

자세한 내용은 C# 언어 사양의 다음 섹션을 참조하세요.

참고 항목