안녕하세요
프리미엄 존에 2020년 4,5회 대비 모의고사 문제 7번에 대해 질문이 있는데요,
문제는
문제7. 다음 Java로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오. (단, 출력문의 출력 서식을 준수하시오.)
public class Test{
public static void main(String[] args) {
int x = 13, y = 9, z = 2;
switch (x ^ y) {
case 1 :
case 2 :
z *= x -= y;
break;
case 3 :
case 4 :
x %= y /= z;
break;
default:
x -= y += z;
}
System.out.printlkn(x + y + z);
}
}
에서 제가 헷갈리는 부분이 있는데요.
case 2번, case4번, default 로 넘어갔을 때 연산을 하는 식에서
저는 x 값만 바뀌고 y나 z 값은 위에서 정의한 9와 2로 고정되는 줄 알았습니다.
예전에 어떤 식에서는 return += a /= 3 뭔가 같은 느낌의 식이 있었는데
거기서는 return 값만 바뀌고 a 값을 새로 정의가 되지 않았던 기억이 남아있습니다.
x -= y += z; 이런 식은 무조건 x 값과 y 값이 새로 정의가 되는건지
아니면, 상황에 따라 x값만 정의되는 경우가 있는지가 궁금합니다.
만약 상황에 따라 x 값만 정의되는 경우가 있다면 어느 경우에 그렇게 되는지도 알려주시면 감사하겠습니다.
저는 y값도 새로 정의되는줄 모르고 x 값 1로 바뀌고 y 값 그대로 9 z 값도 2 해서 답이 12인줄 알았었습니다.
안녕하세요 길벗수험서 운영팀입니다.
연산자 적용 시 연산자 우선순위와 결합규칙을 기억해두세요.
대입연산자가 사용되었으므로 당연히 우측의 값은 좌측에 전달되어야 합니다.
말씀하신 return의 경우 변수 리턴(예약어의 강제 변수화)이라면 a와 return의 값이 변화하는 정상적인 식이지만, 반환하는 예약어인 return이라면 식 자체가 성립되지 않아 의도를 짐작하기 어렵습니다.
대입연산자가 사용되어도 값이 적용되지 않는 경우는 아예 조건을 넣어 수행되지 않도록 하는 방법 외에는 떠오르는 것이 없네요.
혹여 해당 수식을 직접 문의주시면 확인 후 답변드리겠습니다.
행복한 하루되세요 :)
-
관리자2021-04-13 13:47:33
안녕하세요 길벗수험서 운영팀입니다.
연산자 적용 시 연산자 우선순위와 결합규칙을 기억해두세요.
대입연산자가 사용되었으므로 당연히 우측의 값은 좌측에 전달되어야 합니다.
말씀하신 return의 경우 변수 리턴(예약어의 강제 변수화)이라면 a와 return의 값이 변화하는 정상적인 식이지만, 반환하는 예약어인 return이라면 식 자체가 성립되지 않아 의도를 짐작하기 어렵습니다.
대입연산자가 사용되어도 값이 적용되지 않는 경우는 아예 조건을 넣어 수행되지 않도록 하는 방법 외에는 떠오르는 것이 없네요.
혹여 해당 수식을 직접 문의주시면 확인 후 답변드리겠습니다.
행복한 하루되세요 :)
-
관리자2021-04-19 11:46:48
안녕하세요 길벗수험서 운영팀입니다.
예, 맞습니다.
b에 5의 값을 저장한 후, a에는 a*b의 값을 저장하라는 의미죠.
bool의 경우 boolean 자료형으로 참(1)/거짓(0)의 값만이 저장됩니다.
행복한 하루되세요 :)
-
*2021-04-16 19:22:50
안녕하세요.
프로그래밍 언어 영역의 문제를 풀다가 질문 드렸던 비슷한 내용의 문제가 있었는데,
문제 출력 값으로 출력이 되는게 아니어서 확인이 안 되는데 이 경우도 위에 질문드렸던 것처럼 새로 정의가 되는지 봐주시면 감사하겠습니다.
#include <stdio.h>
#include <stdbool.h>
void main() {
int a, b;
bool c, d;
a = 10; b=0;
a *= b = 5;
c = (a != b)
d = (a == b)
print("%d, %d, %d, %d", a, b, c, d) 라면
50, 5, 1, 0
이렇게 b 값도 새로 정의가 돼서 5로 출력이 되는 게 맞나요?
그리고 위에 bool c, d 라고 정의된건
불린으로 참 거짓 값만 나타낸다는 뜻인가요?