C언어 연산자 / 제어문

김지원·2023년 3월 3일

C언어(독학사)

목록 보기
3/7

연산자

연산자와 피연산자

: 연산에 사용되는 기호를 연산자라고 하고 연산의 대상이 되는 값을 피연산자라고 한다.

연산자의 종류

: 연산에 참여하는 피연산자의 개수에 따라 단항, 이항, 삼항 연산자로 구분한다.

단항 연산자 : 피연산자 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^k
ex) 
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() 이용하여 데이터를 입력 받을 때 변수 앞에 사용하거나 포인터에 주소를 저장하기 위해 사용한다.


연산자 우선순위

: 단항 연산자 > 산술 연산자 > 관계 연산자 > 논리 연산자 > 대입 연산자 > 콤마 연산자


제어문(control statement)

조건 분기 제어문

: 조건에 따라 특정 문장을 수행하거나 수행하지 않도록 만드는 명령문

if문

단순 if
if-else문
다중 if-else문
중첩 if문

switch 문

  • 괄호안의 조건식의 결과는 반드시 정수로 가져야 한다.
switch(정수식) {
	case 1 :
    	조건명령문 1;
        break;
    ...
    case n :
    	조건명령문 n;
        break;
    default : 
    	조건명령문 n+1;
        break;
}

반복 제어문

: 조건이 만족할 경우 { } 안의 명령문을 반복해서 실행하는 제어문.

  • 반복해야하는 문장을 여러 번 작성하지 않고 간결한 프로그램작성이 가능해진다.

for문

1) for문의 형식

for(초기화; 조건식; 증감식)

2) 중첩 for문

  • 바깥쪽의 for문이 한 번 수행될 떄 안쪽 for문은 주어진 조건이 만족할 떄 까지 반복수행한다.
    이때 두 반복문을 제어하는 제어 변수는 반드시 달라야 한다.
for(초기화1; 조건식1; 증감식1) {
	for(초기화2; 조건식2; 증감식2) {
    	반복명령문2;
    }
    반복명령문1;
}

while문

: 주어진 조건이 만족되는 동안 {}안의 명령을 반복수행하지만 반복횟수가 정해지지 않은 경우에 사용된다.

while(조건식 / 직접 코드 작성) {
	반복명령문;
}
  • 무한반복 : while(ture) / while(1)

do-while문

: 반복문 내의 명령문을 먼저 실행한 후 주어진 조건을 검사하여 반복 수행 여부를 결정하는 명령문

do {
	반복 명령문;
} while(조건식);

여기까지는 Java와 동일하다. 아래가 중요함.


기타 제어문

goto문

: 프로그램 수행 도중에 원하는 부분으로 무조건 분기시키는 명령문이다.

  • goto문은 Label이 표기된 위치로 무조건 분기되고 이때 Label은 구분할 수 있는 이름과 콜론(:)이 필요하다.
  • 던, Label이 조건문 또는 반복문 내에 위치한 경우는 해당 조건을 만족해야 실행 가능하다. 따라서 외부의 goto문에 의해서 분기될 수 없다.

break문

: switch나 반복문과 함께 사용되는데 특히 무한 루프에서 빠져나올 떄 유용하게 사용된다.

  • 중첩된 반복문에서 break문을 사용하게 되면 해당 break문이 속한 반복문만 빠져나오게 된다.

continue문

: 반복문에서 continue문을 만나면 반복문의 시작부분으로 돌아가도록 한다.

0개의 댓글