다음을 통해 공유


C# 연산자 및 식

C#은 여러 연산자를 제공합니다. 이들 중 대부분은 기본 제공 형식에서 지원되며 이러한 형식의 값을 사용하여 기본 작업을 수행할 수 있습니다. 이러한 연산자는 다음 그룹을 포함합니다.

  • 숫자 피연산자를 사용하여 산술 연산을 수행하는 산술 연산
  • 숫자 피연산자를 비교하는 비교 연산
  • 피연산자를 사용하여 논리 연산을 bool 수행하는 부울 논리 연산
  • 정수 계열 형식의 피연산자를 사용하여 비트 또는 시프트 연산을 수행하는 비트 및 시프트 연산
  • 피연산자가 같은지 여부를 확인하는 같음 연산

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

가장 간단한 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 변화
x < y, x > y, x <= y, x >= y, is, as 관계형 및 형식 테스트
x == y, x != y 평등
x & y 부울 논리 AND 또는 비트 논리 AND
x ^ y 부울 논리 XOR 또는 비트 논리 XOR
x | y 부울 논리 OR 또는 비트 논리 OR
x&y 조건부 AND
x || 와이 조건부 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, => 대입 및 람다 선언

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

연산자 연결성

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

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

중요합니다

P?.A0?.A1의 식에서 if P is null, 둘 다 A0 평가되지도 않습니다 A1 . 마찬가지로, 형식 P?.A0.A1A0 의 식에서 null일 때 P 평가되지 않으므로 둘 다 아닙니다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# 언어 사양의 다음 섹션을 참조하세요.

참고하십시오