int m=10, n=5;
int result;
result = m++ + --n;
printf("m=%d n=%d result=%d\n", m,n,result);
결과는 m=11 n=4 result=14
이렇게 나오잔아? 근데
int a= 10, b=5 ,m =1;
int result;
result = (a <b) && (m++ ==1);
printf("m=%d result=%d\n", m, result); //내가 생각한 결과는 m=2 result=0 실제답 m=1, re~= 0
result = (a >b) || (--m ==0); //내생각 : --m이니깐 m= 2->1이됨 1||1이되니 result=1
printf("m=%d result=%d\n", m, result); //내가 생각한 결과는 m=1 result=1 실제답 1,1
이래.. 첨에 리설트= 0
이떄 m++걸엇ㄱ으니 m->m+1 이렇게 되는거 아니야? 그래서 m=2가되서 출력되는거 아니야?
니 생각이 맞아.
false && x = always false , true || x = always true 잖아.
그래서 컴파일러 최적화 과정에서 저 x 부분을 아예 실행을 안시켜. 하지만 이 컴파일 최적화 옵션을 끄면 실행이 되. C/C++ 은 표준에서 저런경우에 대해 정확히 명시안하고 니 맘대로 하세요라고 해.
니 생각과 실제 결과가 다른건 니가 당연히 실행(evaluate) 이된다고 한부분이 최적화 기능으로 인해 실행이 안되었기 때문이야.
아 형 ㄳ 그러면 앞부분이 무조건 참거짓 판단하니깐 뒷문장은 계산을 ㅎ안한다는거지 ??
어. 맞아. 원래 저게 좋은 방법은 아닌데, C/C++이 원체 효율성을 추구하다보니~ 좀 많이 지저분해.
아 형 다른 콤마연산자문젠데 c= ++a, b++; printf(\"%d %d %d\\n\", a,b,c); 인데
콤마연산자서는 3 +4 , 5-10 이면 결과는 -5잖아
그러면 위문제 결과는 101 51 50 나오지않아..? int a= 100 ,b =50 ,c;
근데 직접넣으면 101 51 101이 뜨네..
연산자는 함수와 같아. 파라미터를 취해서 값을 반환해. 단지 연산자는 연산자 우선순위가 있다는게 함수와 달라. 저 \"++\" 연산자를 함수로 구현한다면..
int prefix_increase(int * value) { (*value) = (*value) + 1 ; return (*value); }
int postfix_increase (int * value) { (*value) = (*value) + 1 ; return ((*value) - 1); }
두 함수 모두 전달받은 변수를 증가시키는데, prefix ++ 함수는 반환값이 증가시킨값이고, postfix ++ 함수는 반환값이 증가시키기 전의 값이야. 이걸 염두에 두고 다시 계산해봐.
형그니깐 b++은 prefix ++ 인거야?? 그래서 연산드간(value -1?) postfix ++ 함수가 콤마보다 먼저계산된다는뜻이야?? 잘모르겟어 .. rmslRKs c= (++a , b++); 이거엿다면 b++ 값이 온다는건가>>? 뭐지??ㅠㅠ
++x : prefix , x++ : postfix .
음, 내가 어렵게 설명한거 같다. 일단 내 얘기는 잊어 버려. 좀더 잘 설명된 책을 다시 한번 참고해봐. 절대 어려운 내용은 아니야.
아 ㅠㅠ 개념이 부족해서 ㅠㅠ
ㅇ그니깐 전위랑 후위가 콤마에 껴잇으면 전위를 대꼬 온다는뜻이야?
니가 질문하는게 뭔지를 모르겠다. 전위/후위 증감 연산자를 모르겠다는거야? 아니면 콤마연산자를 모르겠다는거야?
\"a, b , c ;\" => a 표현식 실행 , b 표현식 실행, c 표현식 실행 , c 표현식의 결과값 반환.
\"++x\" : x 변수를 증가시키고 증가된 x변수의 값을 반환
\"x++\" : x 변수를 증가시키고 증가되기 전의 x변수의 값을 반환
연산자라는건 그 연산을 하고 , 그리고 그 값을 반환해. 이걸 잘 이해하면 돼.
ㅜ 개념설명은 고마워 근데 c= ++a, b++; printf(\"%d %d %d\\n\", a,b,c); 이거면 출력되는건 콤마연산자에 의해 ++a,b++,b++ 아니야..? 근데 답은 보니깐 ++a, b++ ,++a 인거같아..
101 51 101이 당연히 맞지
는 글을 안보고 댓글만 읽음
a=100 b=50 c= ++a, b++이거든..? 그러면 콤마 연산자 에따라 c= b++이 아냐..?
x = 4,5 이면 5아냐..?
c = ++a , b++
c = 101, b++
c = 101 , 50 ; // b 값은 51
c = 50
그럼 101 51 50 아냐? ㅠㅠ
레노미아//컴파일러 최적화가 아니고 뒷부분 실행 안시키는게 C표준...
헐.. 위에꺼 실수..
c = ++a , b++
c = 101 , b++
c = 101, 50 ; //b 값은 51 , = 우선순위가 더 높아서 (c=101), 50 ; 과 같은 표현이어서 그래.
(c=101), 50
101, 50
50
생물학 // 아, 그러네. 내가 잘못알고 있었다. \"short-circuiting and evaluation order \" 은 C/C++ 표준 스펙이 정의되네. 쏘리~~
common lisp 도 표준이고, 아, 내가 다른언어하고 착각했나보다. 미안해.
형그럼 a=101 b=51 c=50 이잔아.. 근데 컴터는 101 51 101 이래.. 책에ㅐ도 101이구..
만약 c = ( 101, 50 ) 이라면 c 는 50 이 되는거고
c = 101 , 50 은 ( c = 101 ) , 50 과 같으니까. c는. 101이 맞아
헠ㅋㅋㅋㅋㅋㅋㅋㅋ c=5,4; 면 그럼 5네 내가 눈뽕이엇나봐 고마워 ㅠㅠ
어. 나도 글쓰는중에 당연히 c=5,4 면 4가 될줄 알았어 ㅋㅋㅋ. 나도 중간에 잠시 헷갈렸다. (나는 실제로 저렇게 코드 잘안짜서)