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 | switch 및 with 식 |
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 = z
는x = (y = z)
로 계산됩니다.
Important
P?.A0?.A1
형식의 식에서 P
가 null
이면, 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# 언어 사양의 다음 섹션을 참조하세요.
참고 항목
.NET