연산자 우선순위

spixychz·2025년 12월 6일

기술면접

목록 보기
5/13

헷갈릴 수 있는 문제

int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = 5;

if ((a = 10) == 10 && (b = 20) == 30 && (c = 30) == 30 || (d = 40) == 40 || (e = 50) == 50)
{
    Console.WriteLine("TRUE");
}

Console.WriteLine($"{a} {b} {c} {d} {e}");

TRUE 출력
a = 10, b = 20, c = 3, d = 40, e = 5

풀이 과정

연산자 우선순위 때문에 실제 연산은

((a = 10) == 10 && (b = 20) == 30 && (c = 30) == 30) || (d = 40) == 40 || (e = 50) == 50

이런식으로 묶인다.

  1. (a = 10) == 10
    • a = 10으로 바뀌고 해당 조건을 만족
  2. (b =20) == 30
    • b = 20으로 바뀌고 해당 조건을 만족하지 않는다.
  3. true && false && (c = 30) == 30
    • 이미 false가 등장했기 때문에 해당 AND 단락에서는 이후 평가가 진행되지 않는다.
  4. (d = 40) == 40
    • d = 40으로 바뀌고 해당 조건을 만족
  5. false || true || (e = 50) == 50
    • 이미 true가 등장했기 때문에 해당 OR 단락에서는 이후 평가가 진행되지 않는다.
  6. if 문 탈출

연산자 우선순위

  1. 괄호
    • ()
  2. 단항 연산자
    • +x -x !x ~x ++x --x x++ x-- (int)
  3. 곱셈, 나눗셈 계열
    • * / %
  4. 덧셈, 뺄셈
    • + -
  5. 시프트
    • << >>
  6. 비교
    • < > <= >= is as
  7. 동등 비교
    • == !=
  8. 비트 AND
    • &
  9. 비트 XOR
    • ^
  10. 비트 OR
    • |
  11. 단락 AND
    • &&
  12. 단락 OR
    • ||
  13. null 병합
    • ??
  14. 조건 연산자
    • ? :
  15. 대입 및 복합 대입
    • = += -= *= /=

실전 포인트

  • 순서 : 산술 → 비교 → 논리 → 할당
  • 괄호를 최우선으로 믿어라
  • 대입 연산자는 항상 제일 마지막
  • &&|| 보다 먼저
  • 단락 평가는 결과가 나오면 뒤쪽은 아예 실행 안 됨

추가 문제

    private void First()
    {
        int a = 5, b = 10, c = 15;

        if ((a = 2) == 3 || (b = 3) == 3 && (c = 7) == 7)
        {
            Debug.Log("IN");
        }

        Debug.Log($"{a}, {b}, {c}");

		// IN
        // 2 3 7
    }

    private void Second()
    {
        int a = 1, b = 2, c = 3, d = 4;

        bool result = (a = 10) > 5 && (b = 20) < 5 || (c = 30) == 30 && (d = 40) == 50;

        Debug.Log(result);
        Debug.Log($"{a} {b} {c} {d}");

        // false
        // 10 20 30 40
    }

    private void Third()
    {
        int x = 0, y = 0, z = 0;

        if ((x = 1) == 1 && (y = 2) == 1 || (z = 3) == 3 && (x = 4) == 4)
        {
            Debug.Log("IN");
        }

        Debug.Log($"{x} {y} {z}");

        // IN
        // 4 2 3
    }

    private void Fourth()
    {
        int a = 1, b = 1, c = 1;

        bool r = (a = 5) == 5 && (b = 6) == 7 || (c = 8) == 8 && (a = 9) == 9;

        Debug.Log(r);
        Debug.Log($"{a} {b} {c}");

        // true
        // 9 6 8
    }

    private void Fifth()
    {
        int a = 1, b = 2, c = 3, d = 4;

        bool r = (a = 10) != 10 && (b = 20) == 20 || (c = 30) > 10 && (d = 40) < 10 || (a = 50) == 50;

        Debug.Log(r);
        Debug.Log($"{a} {b} {c} {d}");

        // true
        // 50 2 30 40
    }
profile
UNITY로 게임 개발하는 사람

0개의 댓글