게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
초보적인 질문 하나만 받아주세요.
게시물ID : programmer_22220짧은주소 복사하기
작성자 : 스누피야
추천 : 0
조회수 : 650회
댓글수 : 12개
등록시간 : 2018/03/23 12:33:01
옵션
  • 본인삭제금지

JAVA공부하다 난관에 봉착했습니다.

왜 i와 j가 12로 저장되는지 이해가 잘 안 되네요.


Q. 다음 실행 후 각각의 변수의 값은?

int i = 8;

i += (i = 4);

int j = 8;

j = j + (j = 4);

i, j 는 모두 12


//

i 식에서 (i=4)로 i 변수에 4를 담은 후 += 연산 했으니 8이 나오는게 맞지 않나요?

그리고 j식에서도 (j=4) 후에 연산하면 8이 되는게 맞는 것 같아요.

왜 두 식 다 12가 저장되나요? ㅠㅠ

전체 추천리스트 보기
2018-03-23 14:52:11추천 0
예? 왜 12이가 나와여?
댓글 0개 ▲
2018-03-23 14:52:56추천 0
일단 2개는 동일한 수식이네요 += 를 풀어서 쓰면  i = i + (i=4) 가 되니 ...

흠.. 일단 VS 환경에서는 값이 8로 나오고, 가로가 있는 이상 자바에서도 8이 나와야 할것 같은데

자바에서 저렇게 값이 나오는거 확인 하셨나요?
A . 값이 12가 나옴 --> "아.. 자바는 이렇게 동작하나 보네.."
B.  값이 8 나옴   --> "아.. 책이 잘못했네"
댓글 0개 ▲
2018-03-23 15:14:31추천 0
해싱 /  이클립스로 돌려봤는데 12로 나오네용 ㅠ 자바랑 다른 언어랑 다른가봐요.
댓글 0개 ▲
2018-03-23 16:18:32추천 0
자바에서 컴파일하면

int i = 8;
byte var10000 = i;
int i = true;
int i = var10000 + 4;

이렇게 만들어 버리네요 'ㅅ'
오호 재미있어라 왜 그런지 찾아봐야지
댓글 0개 ▲
2018-03-23 16:30:40추천 1
gcc에서는 8, java로 하면 12가 나오는데요,
정확한건 어셈블리 코드나 바이트코드 출력물을 보면 되고..
자바의 경우는 i=i+(i=4)를 할 때 i값(8)을 먼저 스택에 넣고 그다음 i=4를 한 다음 8과 i값을 더해서 12가 나오는거 같네요.

물론 실제 업무에 저런코드 쓰면 욕 바가지로 먹으니 이해만 하시고 절대로 쓰지 마세요..
댓글 4개 ▲
2018-03-23 16:32:38추천 0
main:
.LFB0:
.cfi_startproc
pushq   %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq    %rsp, %rbp
.cfi_def_cfa_register 6
movl    $8, -4(%rbp)
movl    $4, -4(%rbp)
movl    -4(%rbp), %eax
addl    %eax, -4(%rbp)
movl    $0, %eax
popq    %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc

gcc에서 컴파일했을때 어셈에선 요래 나오네요
2018-03-23 16:39:14추천 0
자바에서 왜 8을 딴데 넣고 거기다 4를 더하는걸까요?

i에 4를 넣는게 먼저...아닌가요?
[본인삭제]DIABLO3
2018-03-23 17:34:25추천 0
[본인삭제]DIABLO3
2018-03-23 17:47:36추천 0
2018-03-23 17:52:37추천 0
의도가 명확하지 않은 코드를 정의되지 않은 행동(undefined behavior)라 부르는데 컴파일러에 따라 결과가 달라질 수 있으므로 이런 코드의 작성은 피해야 합니다.

그냥 잘못된 행동입니다.
저거 문제 낸사람 때리면 됩니다.

https://dojang.io/mod/page/view.php?id=757

http://story.wisedog.net/undefined-behavior%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80/
댓글 1개 ▲
2018-03-23 18:59:56추천 0
글쿤요.. 교수님이 내신거라 때릴 순 없네요. ㅠㅠ
[본인삭제]받아들여
2018-03-23 19:48:41추천 0
댓글 0개 ▲
2018-03-23 23:52:32추천 0
연산자가 복합 대입 연산자 ( §15.26.2 ) 인 경우 왼쪽 피연산자의 평가에는 왼쪽 피연산자가 나타내는 변수를 기억하고 묵시적 이진 연산에 사용할 해당 변수의 값을 가져 와서 저장하는 작업이 포함됩니다 .
2018-03-24 03:29:59추천 0
재미있어 보이는 주제라 몇개 해봤는데..

VC : 8
Java, C#.NET, JavaScript : 12
Python : 문법 오류

.. 까지는 그런갑다 했는데..
신기했던건..
VB.NET의 결과가 8 이었던 거..
댓글 0개 ▲
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호