C# 강좌 4편. 연산자(Operators) [최근 수정 2017.10.29]
1. 연산자(Operators)
C#에선 산술 연산자, 증감 연산자, 조건 연산자, 관계 연산자, 논리 연산자 등 여러 가지의 연산자를 제공합니다. 오늘은 아래 표에 정리된 연산자들에 대해서 배워보도록 하겠습니다.
분류 |
연산자 |
예 |
수식 연산자 |
+, -, *, /, % |
a = b + c; |
증감 연산자 |
++, -- |
a++; |
할당 연산자 |
=, +=, -=, *=, /=, %= |
a += b + c; |
논리 연산자 |
&&, ||, ! |
a && b |
관계 연산자 |
<, >, ==, !=, >=, <= |
a > b |
비트 연산자 |
&, |, ^ |
a ^ b |
시프트 연산자 |
>>, << |
a >> 2 |
2. 수식 연산자(+, -, *, /, %)
수식 연산자에는 덧셈, 뺄셈, 곱셈, 나눗셈, 그리고 나눗셈을 한 뒤의 나머지를 구하는 연산자들이 있습니다. 아래는 그 연산자들을 표로 정리한 것입니다.
분류 |
기능 |
예 |
+ |
양쪽 피연산자를 서로 더함 |
a + b |
- |
왼쪽 피연산자에서 오른쪽 피연산자를 뺌 |
a - b |
* |
양쪽 피연산자를 서로 곱함 |
a * b |
/ |
왼쪽 피연산자를 오른쪽 피연산자로 나눔 |
a / b |
% |
왼쪽 피연산자를 오른쪽 피연산자로 나눈 뒤의 나머지를 구함 |
a % b |
여기서, 피연산자란 연산의 대상을 말합니다. 예를 들어서, a + b라면 a와 b는 피연산자고 +는 연산자입니다.
아래는 수식 연산자를 사용하여 그 결과를 출력하는 예제입니다.
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int a = 55, b = 4;
Console.WriteLine("{0} + {1} = {2}", a, b, a + b);
Console.WriteLine("{0} - {1} = {2}", a, b, a - b);
Console.WriteLine("{0} * {1} = {2}", a, b, a * b);
Console.WriteLine("{0} / {1} = {2}", a, b, a / b);
Console.WriteLine("{0} % {1} = {2}", a, b, a % b);
}
}
}
...
Console.WriteLine("{0} / {1} = {2}", a, b, a / (double)b);
Console.WriteLine("{0} / {1} = {2}", a, b, (a + 0.0) / b);
Console.WriteLine("{0} / {1} = {2}", a, b, 1.0 * a / b);
...
일종의 꼼수이기는 하지만 위와 같은 방법으로 문제를 해결할 수 있습니다.
분류 |
기능 |
예 |
++ (전위 증가 연산자) |
피연산자의 값을 1만큼 증가 |
++a; |
-- (전위 감소 연산자) |
피연산자의 값을 1만큼 감소 |
--a; |
++ (후위 증가 연산자) |
피연산자의 값을 1만큼 증가 |
a++; |
-- (후위 감소 연산자) |
피연산자의 값을 1만큼 감소 |
a--; |
아래는 증감 연산자를 사용하여 그 결과를 출력하는 예제입니다.
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int a = 1;
Console.WriteLine(++a); // a의 값을 1 증가시키고, a의 값을 출력 (a = 2)
Console.WriteLine(a++); // a의 값을 출력한 뒤, a의 값을 1 증가 (a = 3)
Console.WriteLine(--a); // a의 값을 1 감소시키고, a의 값을 출력 (a = 2)
Console.WriteLine(a--); // a의 값을 출력한 뒤, a의 값을 1 감소 (a = 1)
}
}
}
a++ + b
a++ + --b
++a + a++
분류 |
기능 |
예 |
< |
오른쪽 피연산자가 왼쪽 피연산자보다 크면 참, 작으면 거짓 |
a < b |
> |
왼쪽 피연산자가 오른쪽 피연산자보다 크면 참, 작으면 거짓 |
a > b |
== |
왼쪽 피연산자가 오른쪽 피연산자와 같으면 참, 다르면 거짓 |
a == b |
!= |
왼쪽 피연산자가 오른쪽 피연산자와 다르면 참, 같으면 거짓 |
a != b |
>= |
왼쪽 피연산자가 오른쪽 피연산자보다 크거나 같으면 참, 작으면 거짓 |
a >= b |
<= |
오른쪽 피연산자가 왼쪽 피연산자보다 크거나 같으면 참, 작으면 거짓 |
a <= b |
아래 예제는 관계 연산자를 사용하여 결과를 출력하는 예제입니다.
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int a = 50, b = 60;
Console.WriteLine(a < b); // 50 < 60, True
Console.WriteLine(a > b); // 50 > 60, False
Console.WriteLine(a == b); // 50 == 60, False
Console.WriteLine(a != b); // 50 != 60, True
Console.WriteLine(a >= b); // 50 >= 60, False
Console.WriteLine(a <= b); // 50 <= 60, True
}
}
}
분류 |
기능 |
예 |
= |
오른쪽 피연산자를 왼쪽 피연산자에 할당 |
a = b; |
+= |
a += b는 a = a + b와 같음 |
a += b; |
-= |
a -= b는 a = a - b와 같음 |
a -= b; |
*= |
a *= b는 a = a * b와 같음 |
a *= b; |
/= |
a /= b는 a = a / b와 같음 |
a /= b; |
%= |
a %= b는 a = a % b와 같음 |
a %= b; |
아래는 할당 연산자를 사용하여 그 값을 출력하는 예제입니다.
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int a = 50, b = 60;
a += b;
Console.WriteLine(a);
a -= b;
Console.WriteLine(a);
a *= b;
Console.WriteLine(a);
a /= b;
Console.WriteLine(a);
a %= b;
Console.WriteLine(a);
}
}
}
A |
B |
A && B |
참(T) |
참(T) |
참(T) |
참(T) |
거짓(F) |
거짓(F) |
거짓(F) |
참(T) |
거짓(F) |
거짓(F) | 거짓(F) | 거짓(F) |
<논리곱 연산자(&&)의 진리표>
논리곱(AND) 연산자의 특징은 A와 B 모두 참이여야 결과값으로 참을 반환합니다.
A |
B |
A || B |
참(T) |
참(T) |
참(T) |
참(T) |
거짓(F) |
참(T) |
거짓(F) |
참(T) |
참(T) |
거짓(F) |
거짓(F) |
거짓(F) |
<논리합 연산자(||)의 진리표>
논리합(OR) 연산자의 특징은 A나 B 둘중 하나라도 참일 경우에 결과값으로 참을 반환합니다.
A |
!A |
참(T) |
거짓(F) |
거짓(F) |
참(T) |
<부정 연산자(!)의 진리표>
부정(NOT) 연산자의 특징은 A가 참일 경우에 거짓을, 거짓일 경우에는 참을 결과값으로 반환합니다.
아래는 논리 연산자를 사용하여 그 결과를 출력한 예제입니다.
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int a = 50, b = 60;
Console.WriteLine(a > 40 && b > 50);
Console.WriteLine(a > 40 || b > 70);
Console.WriteLine(!(a < b));
}
}
}
분류 |
기능 |
예 |
& |
두 피연산자의 대응되는 비트에 논리곱(AND)을 수행 |
a & b |
| |
두 피연산자의 대응되는 비트에 논리합(OR)을 수행 |
a | b |
^ |
두 피연산자의 대응되는 비트에 배타적 논리합(XOR)을 수행 |
a ^ b |
여기서 & 연산자는 양쪽 비트가 모두 1이어야만 결과가 1이 되고, 그렇지 않으면 결과가 0이 됩니다. | 연산자는 양쪽 비트 중 하나라도 1이면 결과가 1이 됩니다. ^ 연산자는 양쪽 비트가 서로 달라야 결과가 1이 됩니다. 감이 잘 안오시나요? 예제를 바로 봐보도록 합시다.
아래는 비트 연산자를 사용하여 그 결과를 출력하는 예제입니다.
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int a = 5, b = 10;
Console.WriteLine(a & b);
Console.WriteLine(a | b);
Console.WriteLine(a ^ b);
}
}
}
결과:
0
15
15
계속하려면 아무 키나 누르십시오 . . .
위의 결과가 어떻게 해서 이렇게 나왔는지 아래에서 확인하실 수 있습니다. 10진수 5를 2진수로 나타내면 101(2), 10진수 10을 2진수로 나타내면 1010(2)와 같습니다.
7. 시프트 연산자 (>>, <<)
시프트 연산자도 비트 연산과 관련된 연산자입니다. 이 연산자를 통해 첫 번째 피연산자를 두 번째 피연산자로 지정된 비트 수만큼 왼쪽(<<)으로 이동시키거나 오른쪽(>>)으로 이동시킬 수 있습니다.
아래는 시프트 연산자를 사용하여 그 결과를 출력하는 예제입니다.
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int a = 616;
Console.WriteLine(a << 4);
Console.WriteLine(a >> 4);
}
}
}
결과:
9856
38
계속하려면 아무 키나 누르십시오 . . .
우선, 616을 2진수로 나타내면 1001101000(2) 입니다. 이 비트열을 왼쪽으로 4만큼 이동시키면 아래와 같이 10011010000000(2)가 될 것입니다. 이는 10진수로 나타내면 9856 입니다. 비트열을 왼쪽으로 이동시키면서 새로 나타난 하위 비트는 0으로 채워집니다.
다시 기존 비트열을 오른쪽으로 4만큼 이동시키면 아래와 같이 100110(2)이 될 것입니다. 이는 10진수로 나타내면 38 입니다. 비트열을 오른쪽으로 이동시키면서 새로 나타난 상위 비트는 부호 비트로 채워집니다. (부호 비트는 양수의 경우는 0, 음수의 경우는 1)
다음은 분기문(if, else, switch)에 대해 알아보도록 하겠습니다. 수고하셨습니다.
'프로그래밍 관련 > C#' 카테고리의 다른 글
C# 강좌 6편. 반복문(while, do, for, foreach) [최근 수정 2017.11.10] (15) | 2018.01.12 |
---|---|
C# 강좌 5편. 조건문(if, else, switch) [최근 수정 2017.11.10] (18) | 2018.01.12 |
C# 강좌 3편. 변수, 데이터 형식, 상수 [최근 수정 2017.10.29] (52) | 2018.01.12 |
C# 강좌 2편. Hello, world! [최근 수정 2017.11.27] (38) | 2018.01.12 |
C# 강좌 1편. 시작 (26) | 2018.01.12 |