C++/C++ 강좌 문제 해답

[C++ 강좌 해답] 2-2. 연산자 I 정답 공개 및 해설

카루-R 2022. 2. 16. 15:00
반응형

https://karupro.tistory.com/22 

 

[C++ 강좌] 2-2. 연산자 I

오늘은 변수를 가지고 값을 다루기 위한, 연산자에 대해 알아보겠습니다. 연산자는 크게 산술 연산자, 대입연산자, 비트 연산자, 단항 연산자, 논리 연산자 등이 있습니다. 산술 연산자 이건 익

karupro.tistory.com

2-2 강좌의 도전 과제 해답을 설명합니다.

1. 다음 수식의 값을 구하시오

1 + 2 * 3 - 4

정답: 3

해설: 덧셈, 뺄셈보다 곱셈 연산이 우선이기 때문에 아래와 같이 계산됩니다.

1 + 2 * 3 - 4
= 1 + (2*3) - 4
= 1 + 6 - 4
= 3

2. 다음 중 결과값이 나머지 넷 과 다른 것은?

(1) 1 <= 2  (2) 3 > 2  (3) 1 == 1  (4) 2 != 5 (5) 1 < 1

정답: (5)

해설:

(1): 1은 2보다 작거나 같으므로 참 -> true
(2): 3은 2보다 크므로 참 -> true
(3): 1은 1과 같으므로 참 -> true
(4): 2는 5와 같지 않으므로 참 -> true
(5): 1은 1보다 작다고? -> false

3. 다음 수식의 값을 구하시오.

!(true && false || (false || true) || false && false) && true || !false

정답: true

해설: 연산자 우선순위에 따라 차근차근 계산해봅시다. 무슨 일이 있어도 괄호가 먼저입니다. 그 다음, ! 연산자를 하고 &&, 마지막에 || 순입니다.

!(true && false || (false || true) || false && false) && true || !false
= !(true && false || true || false && false) && true || !false
= !(true && false || true || false && false) && true || true
= !(false || true || false) && true || true
= !true && true || true
= false && true || true
= false || true
= true

참고로 위 식을 바로 std::cout로 출력하면 연산자 우선순위 때문에 false가 출력됩니다. 위 식을 bool 변수에 저장한 다음 그 값을 출력해야 올바르게 출력됩니다.

4. 다음 소스코드의 출력값은 무엇입니까?

int n{5};
std::cout << n++ << std::endl;

정답: 5

해설: 후위 증가 연산자이므로 해당 줄이 실행된 다음에 1 증가시킵니다. 즉, 5를 먼저 출력한 후 n에 1을 더하게 됩니다.

5. [고난이도] 다음 코드가 실행된 후 i, j의 값은 각각 무엇입니까?

int i{3}, j{5};
(++++i == j ? i : j) = i + j++;

정답: 없음 (i = 5, j = 8)

해설: 사실 저런 코드는 작성하면 안 됩니다.

warning: unsequenced modification and access to 'i'
(++++i == j ? i : j) = i + j++;
   ^                   ~
warning: unsequenced modification and access to 'j'
(++++i == j ? i : j) = i + j++;
          ~                 ^

이렇게 한 줄에, 같은 변수에 증감연산자가 복합적으로 쓰인 경우 컴파일러마다 계산이 다 다릅니다. 그래서 Clang같은 컴파일러는 아예 경고를 내 버리죠.

일단 GCC, Clang, VC++모두 (5, 8)을 결과값으로 가집니다. 일단 아셔야 할 것이 후위 연산이 전위 연산보다 먼저 실행이 됩니다.

...? 네. 제대로 들으신 거 맞습니다. ++a보다 a++이 먼저 계산이 됩니다. 물론 결과값이 바뀌는 건 ++a가 먼저이지만 내부적으로는 a++이 먼저 된다는 거죠.

아무튼, 저렇게 한 줄에 여러 변수들이 출몰하면서 증감연산자를 저렇게 쓰면 안 됩니다. 저는 처음에 (10, 6)이 나올 줄 알았는데 아니네요. 분명히 얼마 전에는 (10, 6)이 결과값으로 나왔는데 컴파일러가 달라서 그런지 엉뚱한 값이 나옵니다. 이번 문제의 정답은 없습니다.

반응형