: 연산에 사용되는 기호를 연산자라고 하고 연산의 대상이 되는 값을 피연산자라고 한다.
: 연산에 참여하는 피연산자의 개수에 따라 단항, 이항, 삼항 연산자로 구분한다.
단항 연산자 : 피연산자 1개 이항 연산자 : 피연산자 2개 삼항 연산자 : 피연산자 3개 - 조건 연산자(? :)가 유일한 삼항 연산자
- 연산자의 기능에 따라서도 분류가 가능하다.
아래에서 연산자의 종류에 대해 더 정확히 알아보도록 하자.
: 기본적인 연산
+-*/% (:나머지 연산자)가 있다.
5 / 3 을 했을 때 수학적으로 몫이 1.6666666667 이 되지만 C에서는 소수점 이하인 0.6666666667은 버리고 몫의 정수 부분인 1만 얻게 된다.
- 만일 피연산자들이 같은 자료형이 아니라면 컴파일러가 하나의 자료형을 강제로 형변환시켜 자료형을 일치시키고 연산을 수행한다.
12.6 / 2 → 정수 2를 실수 2.0으로 변환 후 12.6 / 2.0 연산을 수행해 결과 6.3을 얻는다.
- 여기서 알 수 있는 점은 컴파일러가 데이터 손실을 최소화하기 위해 두 피연산자 중 작은 크기의 자료형을 큰 크기의 자료형으로 변환시킨다, 이것을 묵시적 형변환이라한다.
뒤에서 더 자세히 다루도록 하겠다.
1) 대입연산자
: 치환 연산자로고도 하며 연산자(=)의 우측에 있는 수식의 결과값을 좌측에 있는 변수에 저장하는 연산자이다. (오른쪽에서 왼쪽의 순서로 진행)
- 오른쪽에는 어떠한 수식도 올 수 있지만 왼쪽은 결과를 저장해야하는 변수가 무조건 와야한다.
a = b; c = 3;
2) 복합 대입 연산자
: 대입 연산자를 산술 연산자, 비트 연산자와 결합하여 사용하는 것이다.
- 연산자의 좌측에 있는 변수를 이용해 연산을 수행하고 연산의 결과를 다시 좌측에 변수에 대입하는 것이다.
- 동일한 벼수명을 사용함으로 코드를 줄여주는 효과가 있다. 그런데 복합 대입 연산자는 우선순위가 낮으므로 사용에 주의해야한다.
x += 5; → x = x + 5;
: 변수의 값을 1만큼 증가, 감소시킬 때 사용하는 연산자이다.
증가 연산자(++) : 변수 값을 1만큼 증가 감소 연산자(--) : 변수 값을 1만큼 감소
- 반드시 변수에만 사용해야 하며 변수가 아닌 상수나 수식에 사용하면 컴파일 에러난다.
: 두 수의 값을 비교하기 위한 연산자로 참(true, 1) / 거짓(false, 0) 의 결과로 표현한다.
- 기준이 되는 값은 연산자 왼편에 있는 값이므로
x > y라면 ' x가 y보다 크다' 라고 해석해야한다.- 주로 조건문 if 반복문 while의 조건식에서 참과 거짓을 판별할 때 사용한다.
: 논리값 참과 거지을 이용한 연산으로
논리곱(AND, &&),논리합(OR, ||),부정(NOT, !)3가지가 있다. 결과 또한 참(true, 1) / 거짓(false, 0) 으로 나온다.
- 보통 논리 값을 결과로 갖는 관계연산자와 함께 사용 되는데 관계 연산자보다 순위가 낮아서 주의해야한다.
AND 입력값 모두 참(1)인 경우 : 결과 값 참(1) OR 입력값 둘 중 하나 참(1)인 경우 : 결과 값 참(1) NOT 입력값 참(1)인 : 결과 값 거짓(0) NOT 입력값 거짓(0)인 : 결과 값 참(1)
1) 비트 논리 연산자
: 값을 2진수로 바꾼 후 연산을 수행한다. 이때 피연산자의 자료형은 반드시 정수형이어야 한다.
- 논리 연산자와 다를 건 없는데
XOR(eXclusive OR)연산을 수행하는 비트XOR연산자(^)가 포함된다.
배타적 논리합 XOR: 입력된 두 비트 값이 서로 다르면 1, 같으면 0이 되는 연산.- 정수를 2진수로 표현 후 같은 위치에 있는 비트끼리 비교하여 1,0을 가려내면 된다.
cf) 컴퓨터는 모든 데이터를 2진 값으로 처리한다. 2진 자료를 저장할 수 있는 최소 단위가 비트이다.
2) 비트 이동 연산자(shift 연산자)
: 2진수의 비트열을 지정하는 횟수만큼 왼쪽 또는 오른쪽으로 이동하는 연산자이다.
10<<2연산을 그림으로 나타낸 것이다.
10을 왼쪽으로 2만큼 이동한다는 의미로 왼쪽 00이 잘려나가고 오른쪽 새로운 빈자리는0으로 채워진다.
- 반대로
10>>2을 하면 오른쪽 비트가 잘려나가고 왼쪽 빈자리는 부호 비트(양수 : 0, 음수 : 1)에 따라 채워진다.
비트 이동 연산 후 나오는 결과값
오른쪽 값 : k 비트 왼쪽 이동 = 기준값 x 2^k 비트 오른쪽 이동 = 기준값 / 2^kex) 10<<2 = 40(16진값 00000028) 10>>2 = 2(16진값 0000002)
: ? 앞의 조건식이 참이면 x가 선택되고 거짓이라면 y를 선택하여 실행
(조건식 ? x : y)
1) sizeof 연산자
: 주어진 값이나 데이터형의 크기(byte)를 알고자 할 때 사용
- C언어에서 사용하는 데이터형의 크기는(byte) 사용하는 컴파일러에 따라 다르기 때문에 정확한 크기를 알아야 할 때
sizeof()함수를 이용한다.
2) 형변환 연산자
: 이미 선언된 변수의 자료형을 변경하는 연산자
2-1) 암시적 형변환
: 소스에서 따로 명시하지 않아도 컴파일러가 자동으로 처리하는 변환.
- 피연산자가 일치하지 않은 경우 = 다른 타입의 데이터를 연산할 때
작은 범위를 가진 자료형을 큰 범위의 자료형으로 자동 형변환 시킴.char < short < int, long < float < double
- 변수와 값의 일치가 다를 때 = 변수의 데이터형과 저장될 변수의 데이터 값이 다를 때
ex) 정수형 변수에 실수형 값을 대입하는 경우 왼쪽 변수에 자료형을 일치시킴으로 오른쪽 실수형 값의 소수 이하가 잘려서 정수 부분만 남는다.
이처럼 값이 일부가 잘리게 되면 컴파일러가 경고 메시지를 프로그래머에게 보여준다.
2-2) 명시적 형변환 (강제적 형변환)
: 프로그래머가 형변환 연산자에 의해 강제적으로 변환시키는 것.
- 명시적 형변환은 연산 전 형변환과 연산 후 형변환의 결과 값이 다를 수 있음으로 주의해야한다.
3) 콤마 연산자
: 한 문장에 여러 함수 호출문을 호출하거나 둘 이상의 변수를 선언할 떄 사용한다.int a = 10, b = 10, c; a++, b++, printf("연산실행");
4) 주소 연산자(&)
: 변수 앞에 쓰이는 단항 연산자로 주로 scanf() 이용하여 데이터를 입력 받을 때 변수 앞에 사용하거나 포인터에 주소를 저장하기 위해 사용한다.
: 단항 연산자 > 산술 연산자 > 관계 연산자 > 논리 연산자 > 대입 연산자 > 콤마 연산자
: 조건에 따라 특정 문장을 수행하거나 수행하지 않도록 만드는 명령문
단순 if if-else문 다중 if-else문 중첩 if문
- 괄호안의 조건식의 결과는 반드시 정수로 가져야 한다.
switch(정수식) { case 1 : 조건명령문 1; break; ... case n : 조건명령문 n; break; default : 조건명령문 n+1; break; }
: 조건이 만족할 경우 { } 안의 명령문을 반복해서 실행하는 제어문.
- 반복해야하는 문장을 여러 번 작성하지 않고 간결한 프로그램작성이 가능해진다.
1) for문의 형식
for(초기화; 조건식; 증감식)2) 중첩 for문
- 바깥쪽의 for문이 한 번 수행될 떄 안쪽 for문은 주어진 조건이 만족할 떄 까지 반복수행한다.
이때 두 반복문을 제어하는 제어 변수는 반드시 달라야 한다.for(초기화1; 조건식1; 증감식1) { for(초기화2; 조건식2; 증감식2) { 반복명령문2; } 반복명령문1; }
: 주어진 조건이 만족되는 동안 {}안의 명령을 반복수행하지만 반복횟수가 정해지지 않은 경우에 사용된다.
while(조건식 / 직접 코드 작성) { 반복명령문; }
- 무한반복 : while(ture) / while(1)
: 반복문 내의 명령문을 먼저 실행한 후 주어진 조건을 검사하여 반복 수행 여부를 결정하는 명령문
do { 반복 명령문; } while(조건식);
여기까지는 Java와 동일하다. 아래가 중요함.
: 프로그램 수행 도중에 원하는 부분으로 무조건 분기시키는 명령문이다.
- goto문은 Label이 표기된 위치로 무조건 분기되고 이때 Label은 구분할 수 있는 이름과 콜론(:)이 필요하다.
- 던, Label이 조건문 또는 반복문 내에 위치한 경우는 해당 조건을 만족해야 실행 가능하다. 따라서 외부의 goto문에 의해서 분기될 수 없다.
: switch나 반복문과 함께 사용되는데 특히 무한 루프에서 빠져나올 떄 유용하게 사용된다.
- 중첩된 반복문에서 break문을 사용하게 되면 해당 break문이 속한 반복문만 빠져나오게 된다.
: 반복문에서 continue문을 만나면 반복문의 시작부분으로 돌아가도록 한다.