본문 바로가기

자격증 공부/정보처리기사 실기

[흥달쌤] 깨알 C언어) 연산자(+삼항 연산자), 출력 형식

[깨알 C언어 5~13 영상]

 

[] 아래 C 프로그램의 실행 결과는?

#include <stdio.h>
void main(){
    int a, b;

    a = 4 * (1 / 2);   // 1/2 = 0 (정수 나눗셈) → a = 4 * 0 = 0

    b = a++;           // 후위 증가: b = a(0) 저장 후 a는 1로 증가

    printf("%d", b);   // b 출력 → 0
    // 최종 결과: 0
}

 

0    1    2    3

 

→ ① 0

 

 

※ 산술 연산자 종류

구분 종류
이항 연산자 +, -, *, /, % 3 * 4;
단항 연산자 ++, -- 4++;
대입 연산자 =, +=, -=, *=, /=, %= a += 3;

 


 

[] 아래 C 프로그램의 출력은?

#include <stdio.h>
int main(){
    int a = 5, b = 5;
    a *= 3 + b++;
    printf("%d %d", a, b);
    return 0;
}


// 과정 → 결과

int a = 5, b = 5;

a *= 3 + b++; 
// b++ → 현재 값 5 사용 후 b는 6으로 증가
// 3 + 5 = 8
// a *= 8 → a = 5 * 8 = 40

printf("%d %d", a, b);
// a = 40, b = 6 출력

// 최종 결과: 40 6
// 정답: ②

 

40 5
40 6
45 5
45 6

 

→ ② 40 6

 

 

※ 산술연산자 종류

구분 종류
높음 () 괄호
++, --, ~, ! 단항
| *, /, % 산술
| +, - 산술
| <<, >> 비트
| <, <=, >, >= 비교
| ==, != 관계
| &, ^, | 비트
&&, || 논리
낮음 =, +=, -=, *=, /=, %= 대입

 

 

※ 연산자 우선순위 예시

int a = 3;
int b = 4;
int c = 5;
int d = 6;

 

① a * b + c >= d && d / a - b != 0

→ 결과 : 둘 다 참이므로, 1

 

② d % b + ++a * c-- =

→ 결과 a 1값 증가 → d % b 결괏값 2 → a*c-- 결괏값 20(계산 후 c -1) → 2 + 20 → 22

 


 

[] 아래 C 프로그램의 출력은?

#include <stdio.h>
int main()
{
    int i = 3;
    int j = 4;
    if ((++i > j--) && (i++ < --j)) i = i-- + ++j;
    else j = i-- - --j;
    printf("%d\n", i);
}


// 과정 → 결과

int i = 3;
int j = 4;

// if ((++i > j--) && (i++ < --j))

// 1단계: ++i > j--
// ++i → i = 4
// j-- → 비교 후 j 감소 (현재 비교 시 j=4)
// 4 > 4 → false(0)
// j는 이후 3이 됨

// && 연산은 앞이 false이면 뒤 조건 평가 안함 (short-circuit)

// 따라서 (i++ < --j)는 실행되지 않음
// 현재 상태: i = 4, j = 3

// else 실행
// j = i-- - --j
// i-- → 먼저 4 사용 후 i=3
// --j → 먼저 j=2 감소 후 사용

// j = 4 - 2 = 2

// 최종 i 값은 3

printf("%d\n", i);
// 출력: 3

 

→ 3

 

 

※ 논리연산자 종류

연산자 결과값
! !9 0
&& 3 >= 3 && 3 > 3 0
|| 5 > 5 || 5 >= 5 1

 

 

※ 조건문

• 단순 if 문
if(조건){
    조건이 만족할때의 처리;
}


• if ~ else 문
if(조건){
    조건이 만족할때의 처리;
}
else{
    조건이 아닐때의 처리
}


• 다중 if 문
if(조건1){
    조건1이 만족할때의 처리;
}
else if(조건2){
    조건2가 만족할때의 처리
}
else{
    모든 조건이 아닐때의 처리
}

 


 

[] 아래 C 프로그램의 실행결과는?

#include <stdio.h>
int main(){
    int a = 3+5, b = 1, c;
    int ap, bp;
    ap = a++;
    bp = ++b;
    b = 3 * (ap == 8);
    c = 5 * (ap != 8);
    printf("%d %d %d %d %d", a, b, c, ap, bp);
}


// 과정 → 결과
int a = 3+5, b = 1, c;   // a=8, b=1
int ap, bp;

ap = a++;                // ap=8 저장 후 a=9
bp = ++b;                // b=2 증가 후 bp=2

b = 3 * (ap == 8);       // ap=8 → (참=1) → b=3*1=3
c = 5 * (ap != 8);       // ap=8 → (거짓=0) → c=5*0=0

printf("%d %d %d %d %d", a, b, c, ap, bp);
// a=9, b=3, c=0, ap=8, bp=2

// 최종 결과: 9 3 0 8 2

 

→ 93082

 

 

※ 관계연산자 종류

연산자 결과값
== 10 == 9 0
!= 3 != 3 0
> 5 > 5 0
>= 5 >= 5 1
< 7 < 7 0
<= 7 <= 7 1

 


 

[] 다음과 같은 C 언어 문장에서 모든 변수가 int형이라고 가정할 ,
문장을 실행한 결과 변수들의 값은 얼마인가?

y = 3 + 2 * (x = 7 / 2);

 

x=3, y=3
x=3, y=9
x=3, y=10
x=3.5, y=10

 

→ ② x=3y=9

 


 

[] 다음 C 프로그램의 실행 결과는?

#include <stdio.h>
void main(){
    double d_value;
    float f_value = 5.65;
    int n;

    d_value = f_value;
    d_value = d_value + 0.5;
    n = (int)d_value;

    printf("%3.1f, %d", d_value, n);
}


// 실행 과정 → 결과

float f_value = 5.65;     // f_value = 5.65
double d_value;
int n;

d_value = f_value;        // d_value = 5.65

d_value = d_value + 0.5;  // 5.65 + 0.5 = 6.15

n = (int)d_value;         
// 형변환(int)
// 소수점 버림 → n = 6

printf("%3.1f, %d", d_value, n);
// %3.1f → 소수 첫째 자리까지 출력
// 6.15 → 반올림 → 6.2 출력

// 최종 결과: 6.2, 6
// 정답: ④

 

6.1, 5
6.1, 6
6.2, 5
6.2, 6

 

→ ④ 6.26

 

 

※ 출력 변환기호

기호 의미 데이터 타입
%d 부호 있는 10진수 출력 정수, 문자
%f 고정 소수점으로 출력 정수, 실수
%c 문자 출력(문자 하나) 문자
%s 문자열 출력 문자열 포인터
%x 16진수 출력 정수
%o 8진수 출력 정수
① printf("값1 : %d, 값2 : %d", 10, 5);
값1 : 10, 값2 : 5

② printf("값 : %c", 65);
값 : A

③ printf("값 : %c", 'A');
값 : A

④ printf("값 : %s", "안녕하세요.");
값 : 안녕하세요.

⑤ printf("값 : %x", 34);
값 : 22

⑥ printf("값 : %o", 34);
값 : 42
※ 정수형 자리수 지정

① printf("값 : %d", 13);
값 : 13

② printf("값 : %5d", 13);   // 5개의 빈칸을 만들고 뒤부터 채움
값 :    13

③ printf("값 : %05d", 13);  // 5개의 빈칸을 만들고 빈 곳에 0값 입력
값 : 00013
※ 실수형 자리수 지정

③ printf("값 : %-6.1f", 3.26);
값 : 3.3   

// %-6.1f
// - : 왼쪽 정렬
// 6 : 전체 자리수 6칸 확보
// .1 : 소수점 첫째 자리까지 출력
// 3.26 → 반올림 → 3.3
// 남는 칸은 오른쪽 공백 처리


④ printf("값 : %-6.3f", 3.26);
값 : 3.260 

// %-6.3f
// - : 왼쪽 정렬
// 6 : 전체 자리수 6칸 확보
// .3 : 소수점 셋째 자리까지 출력
// 3.26 → 3.260으로 출력
// 남는 칸은 오른쪽 공백 처리

 


 

[] 다음 C 프로그램의 실행 결과는?

#include <stdio.h>
void main(){
    int x = 0x11;
    int y, z;

    y = x & 0x0f;
    z = x | 0x0f;

    printf("x=%d, y=%d, z=%d", x, y, z);
}

 

x=11, y=1, z=31
x=11, y=31, z=1
x=17, y=1, z=31
x=17, y=31, z=1

 

→ ③ x=17, y=1, z=31

// 풀이 과정 → 결과

int x = 0x11;
// 16진수 0x11 = 17(10진수)
// 00010001(2진수)

y = x & 0x0f;
// 0x0f = 15 = 00001111(2진수)

// AND 연산
// 00010001
// 00001111
// --------
// 00000001 → 1

z = x | 0x0f;
// OR 연산
// 00010001
// 00001111
// --------
// 00011111 → 31

printf("x=%d, y=%d, z=%d", x, y, z);

// x = 17
// y = 1
// z = 31

// 최종 결과: x=17, y=1, z=31
// 정답: ③

 

 

※ 진법변환

① 10진수 → 2진수

  19 C
2 9 1
2 4 1
2 2 0
2 1 0
19 ÷ 2 = 9 ... 1
9 ÷ 2 = 4 ... 1
4 ÷ 2 = 2 ... 0
2 ÷ 2 = 1 ... 0
1 ÷ 2 = 0 ... 1

아래에서 위로 나머지를 읽음
→ 10011(2)

 

② 2진수 → 8진수(3자리씩 끊기)

10011(2)

3자리씩 끊기 위해 앞에 0 추가
→ 010 011

각 자리 계산
010 → 0×4 + 1×2 + 0×1 = 2
011 → 0×4 + 1×2 + 1×1 = 3

→ 23(8)

 

③ 2진수 → 16진수(4자리씩 끊기)

10011(2)

4자리씩 끊기 위해 앞에 0 추가
→ 0001 0011

각 자리 계산
0001 → 0×8 + 0×4 + 0×2 + 1×1 = 1
0011 → 0×8 + 0×4 + 1×2 + 1×1 = 3

→ 13(16)

 

 

※ 비트연산자 종류

기호 의미 예 → 연산 결과
& 비트 논리곱(AND)
→ 둘 다 참일 때 참
5 & 3 0101 & 0011 → 1
| 비트 논리합(OR)
→ 둘 중 하나만 참이어도 참
5 | 3 0101 | 0011 → 0111 → 7
^ 비트 배타적 논리합(XOR)
→ 두 값이 틀려야 참
5 ^ 3 0101 ^ 0011 → 0110 → 6
~ 비트 NOT
→ 만약, 양수라면 +1후 -붙임 || 음수라면 -1후 +붙임
~5 -6
>> 비트값을 우측으로 이동 5 >> 3  
<< 비트값을 좌측으로 이동 5 << 3  

 

① 논리곱 (& 연산자)

19 & 13

19 → 10011
13 → 01101

AND 연산
1 & 0 = 0
0 & 1 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

결과
00001(2진수)

→ 1(10진수)

 

② 논리합 (| 연산자)

19 | 13

19 → 10011
13 → 01101

OR 연산
1 | 0 = 1
0 | 1 = 1
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1

결과
11111(2진수)

16 + 8 + 4 + 2 + 1 = 31

→ 31(10진수)

 

③ 비트 NOT (~ 연산자)

~16 = -17
~-16 = 15

// 비트 NOT(~)
// 각 비트를 반대로 뒤집는 연산

// 공식
// ~n = -(n + 1)

// 계산
// ~16 = -(16 + 1) = -17
// ~-16 = -(-16 + 1)
//       = -(-15)
//       = 15

 


 

[] C 프로그램의 실행 결과로 옳은 것은?

#define VALUE1 1
#define VALUE2 2

main(){
    float i;
    int j, k, m;

    i = 100 / 300;
    j = VALUE1 & VALUE2;
    k = VALUE1 | VALUE2;

    if(j && k || i) m = i + j;
    else m = j + k;

    printf("i = %.1f j = %d k = %d m = %03d\n", i, j, k, m);
}

 

i = 0.0 j = 0 k = 3 m = 003
i = 0.3 j = 0 k = 3 m = 000
i = 0.0 j = 1 k = 1 m = 001
i = 0.3 j = 1 k = 1 m = 001

 

→ ① i = 0.0 j = 0 k = 3 m = 003

#define VALUE1 1
#define VALUE2 2

main(){
    float i;
    int j, k, m;

    i = 100 / 300;        // 정수 / 정수 → 정수 나눗셈 → 0, 이후 float에 저장 → 0.0

    j = VALUE1 & VALUE2;  // 1 & 2
                          // 01 & 10 = 00 → j = 0

    k = VALUE1 | VALUE2;  // 1 | 2
                          // 01 | 10 = 11 → k = 3

    if(j && k || i)       // j && k → 0 && 3 = 0
                          // 0 || i → 0 || 0.0 = 0 → false
        m = i + j;
    else
        m = j + k;        // m = 0 + 3 = 3

    printf("i = %.1f j = %d k = %d m = %03d\n", i, j, k, m);
    // %.1f  → 소수 첫째 자리까지 출력 → 0.0
    // %03d  → 3자리 정수 출력, 빈칸은 0으로 채움 → 003

    // 최종 결과: i = 0.0 j = 0 k = 3 m = 003
    // 정답: ①
}

 

 

매크로란?

     • 반복적인 일들을 쉽게 하기 위해 만들어 놓은

#define N 10           // 변수 선언
#define SQR(X) X*X     // 함수처럼 선언
// 예시.

#define N 10
#define SQR(X) X*X

SQR(N);
SQR(N+2);

100
32


// 실행 과정 → 결과

#define N 10
#define SQR(X) X*X
// 매크로는 함수가 아니라 단순 문자 치환

SQR(N);
// → N*N
// → 10*10
// → 100

SQR(N+2);
// → N+2*N+2 로 그대로 치환
// → 10 + 2*10 + 2
// → 10 + 20 + 2
// → 32

// 이유
// 매크로에 괄호가 없어서 연산자 우선순위가 그대로 적용됨
// * 가 + 보다 먼저 계산됨

// 안전한 작성 방식
// #define SQR(X) ((X)*(X))

// 최종 결과
// SQR(N)   → 100
// SQR(N+2) → 32

 

 

※ 시프트 연산 >>
10 >> 2

// 10의 2진수
// 10 = 1010(2진수)

10 >> 2
// 오른쪽으로 2칸 이동
// 1010 → 0010
// 결과: 2

// 의미
// 오른쪽 시프트 1번 ≒ 2로 나누기
// 10 >> 2 = 10 / 4 = 2



※시프트 연산 <<
10 << 2

// 10의 2진수
// 10 = 1010(2)

10 << 2
// 왼쪽으로 2칸 이동
// 1010 → 101000
// 결과: 40

// 의미
// 왼쪽 시프트 1번 ≒ 2를 곱하기
// 10 << 2 = 10 * 4 = 40


// 최종 결과
// 10 >> 2 = 2
// 10 << 2 = 40

 


 

[] C 프로그램의 실행 , 출력 결과 값은?

void main(void){
    int a, b;

    a = 20;
    b = (a > 10) ? a+a : a*a;

    printf("b=%d\n", b);
}

 

b=20
b=40
b=400
b=2020

 

→ ② b=40

// 실행 과정 → 결과

void main(void){
    int a, b;

    a = 20;

    b = (a > 10) ? a+a : a*a;
    // a > 10 → 20 > 10 → true(참)
    // 참이므로 a+a 실행
    // 20 + 20 = 40
    // b = 40

    printf("b=%d\n", b);
    // 출력: b=40
}

// 최종 결과
// b=40
// 정답: ②

 

 

삼항 연산자

  • 조건에 따라서 다른 명령을 수행 하는 연산자
  • 구조 → 조건 ? : 거짓
int a = 10 > 5 ? 10 : 5;
printf("%d", a);


// 실행 과정
// 10 > 5 → true(참)
// 참이므로 ? 뒤의 10 선택
// a = 10

// 출력 결과
// 10