C#에서 쓰이는 연산자의 종류
- 증가/감소 연산자 : ++, --
- 산술 연산자 : +,-,/,*
- 비트 시프트 : <<, >>
- 관계 연산자 : <, >, <=, >=, !=, ==
- 비트 논리 연산자 : &, ^, |
- 논리 연산자 : &&, ||
- 할당 연산자 : =, *=, -=, *=, /=, >>=, <<=, &=, |=, ^=
C#에서 쓰이는 추가 연산자
null 조건부 연산자
?. / ?[]
Nullable 변수에 대해 null이 아닐 때만 값을 반환하고 null일 경우 null을 반환
[]의 경우 배열과 같은 인덱스 접근이 가능한 개체에 쓰인다.
null 병합 연산자
var value = lhs ?? rhs
value에는 왼쪽 피연산자 lhs가 null이 아닐 경우 lhs의 값이 대입되고 아니라면 오른쪽 피연산자 rhs값이 대입된다.
namespace HelloWorld
{
class Foo
{
public int member;
}
class MainApp
{
static void Main(string[] args)
{
ArrayList list = null;
list?.Add("야구"); // Add는 호출되지 않는다.
list?.Add("축구");
WriteLine($"Count : {list?.Count}"); // 아무것도 출력되지 않는다.
WriteLine($"{list?[0]}");
WriteLine($"{list?[1]}");
list = new ArrayList();
list?.Add("야구");
list?.Add("축구");
WriteLine($"Count : {list?.Count}"); // 2
WriteLine($"{list?[0]}"); // 야구
WriteLine($"{list?[1]}"); // 축구
// null 병합 연산자
// 왼쪽 피연산자가 null인지 평가한다.
// 평가 결과가 null이 아닌 것으로 나타나면 왼쪽 피연산자를 그대로 반환
// 왼쪽 피연산자가 null이라면 오른쪽 피연산자를 반환한다.
int? num = null;
Console.WriteLine($"{num ?? 0}");
Read();
}
}
}
연산자의 우선순위
1. 증가/감소 연산자 및 null 조건부 후위 ++/-- 연산자
2. 증가/감소 연산자 전위 ++/-- 연산자
3. 산술 연산자 * / %
4. 산술 연산자 + / -
5. 시프트 연산자 << >>
6. 관계 연산자 < > <= >= is as
7. 관계 연산자 == !=
8. 비트 논리 연산자 &
9. 비트 논리 연산자 ^
10. 비트 논리 연산자 |
11. 논리 연산자 &&
12. 논리 연산자 ||
13. null 병합 연산자 ??
14. 조건 연산자 ?:
15. 할당 연산자 = *= /= %= += -= <<= >>= &= ^= |=
간단한 예제
using System;
using System.Globalization;
using System.Collections;
using static System.Console;
namespace HelloWorld
{
class Foo
{
public int member;
}
class MainApp
{
static void Main(string[] args)
{
/* 연산자의 우선순위*/
// 1. 증가/감소 연산자 및 null 조건부 후위 ++/-- 연산자
// 2. 증가/감소 연산자 전위 ++/-- 연산자
// 3. 산술 연산자 * / %
// 4. 산술 연산자 + / -
// 5. 시프트 연산자 << >>
// 6. 관계 연산자 < > <= >= is as
// 7. 관계 연산자 == !=
// 8. 비트 논리 연산자 &
// 9. 비트 논리 연산자 ^
// 10. 비트 논리 연산자 |
// 11. 논리 연산자 &&
// 12. 논리 연산자 ||
// 13. null 병합 연산자 ??
// 14. 조건 연산자 ?:
// 15. 할당 연산자 = *= /= %= += -= <<= >>= &= ^= |=
int a = 1;
int b = 2;
// 연산자 우선순위에 따른 계산 예제
int result1 = a << 4 + 2 * 1 + b >> 1;
// 1) 4 + (2*1) + b == 8;
// 2) a << 8 == 256;
// 3) 256 >> 1 == 128;
Console.WriteLine("{0:D}", result1); // 128
int result2 = a << 4 + 4 & 0xff;
// 1) 1 << 8 == 0x100;
// 2) 0x100 & 0xff = 0;
Console.WriteLine("{0:D}", result2); // 0
int result3 = 6 + b << 2 >> 4;
// 1) 6 + b == 8
// 2) 8 << 2 == 32
// 3) 32 >> 4 = 2
Console.WriteLine("{0:D}", result3); // 2
Read();
}
}
}
1) int result1 = a << 4 + 2 * 1 + b >> 1;
- 4 + (2*1) + b == 8;
- a << 8 == 256;
- 256 >> 1 == 128;
2) int result2 = a << 4 + 4 & 0xff;
- 1 << 8 == 0x100;
- 0x100 & 0xff = 0;
3) int result3 = 6 + b << 2 >> 4;
- 6 + b == 8;
- 8 << 2 == 32;
- 32 >> 4 = 2;