#include <stdio.h>
int main(void) {
int i;
i = 10;
i*= 10+2;
printf("%d",i);
return 0;
}
왜 다음 코드는 120이 아닌 102의 출력입니까?C 연산자의 실행 순서
#include <stdio.h>
int main(void) {
int i;
i = 10;
i*= 10+2;
printf("%d",i);
return 0;
}
왜 다음 코드는 120이 아닌 102의 출력입니까?C 연산자의 실행 순서
우선 순위에 따라 '+'가 * =보다 높기 때문에 10 + 2는 i * =가되기 때문에 발생합니다.
이
i*= 10 + 2;
는 내가 * = 추가, 나머지는 우선 순위가 왼쪽에서 오른쪽으로되어
i= i * (10 + 2);
에 대한 문법 설탕이며,이 라인에서 mult./division
나는 왜 이런 일이 일어 났는지 이해하는 가장 분명한 방법 인 것처럼 왜이 것이 downvoted인지 잘 모르겠다. 아마도 두 사람이 혼란스러워서 복합 대입 연산자가 자신의 우선 순위를 갖고 실제로 설명하는 방식으로 분해되지 않는다는 사실에 착각 한 것입니까? –
나는 투표하지는 않았지만 질문에 대답하지 않습니다. 설명은'* ='가'+'보다 낮은 우선 순위를 가졌지 만'* ='는 문법적 설탕이 아닙니다. – Peter
이 미묘한 세부 사항으로 인해 투표가 가혹한데, 이것은 단지 통사론적인 설탕이 아닙니다. 6.5.16을 참조하십시오. E1 op = E2 형식의 복합 할당은 왼쪽 값 E1이 한 번만 계산된다는 점을 제외하면 간단한 할당 표현식 E1 = E1 op (E2)와 같습니다. 그게 그렇게 중요한 건가? 예, 피연산자를 평가하면 부작용이 발생합니다. 예를 들어'i'가 volatile로 선언되었다고 가정하십시오. 'i * = a + b;'는'i = i * (a + b);와 똑같지 않다. – Lundin
후 SUBST 10 + 2; 이 경우, i는 12로 곱한다. i = 10 * 12; 그러면 대답은 120이됩니다. 대답은
이 문제를 해결하려면 시도해보십시오.
i*= 10;
i+=2;
이 답변에 추가 할 연산자 우선 순위에 대해 설명하고 이유를 설명해 주시겠습니까? –
코드 작업은 다음과 같습니다.
i= i*(10+2)
는 그래서 120
같은 대답을 줄 경우 102처럼 네가 원하는 대답.
i=i*10+2
http://en.cppreference.com/w/c/language/operator_precedence에서 주문할
C 레퍼런스'난 = i가 (10 + 2) ' – d9ngle
*'= 10 + 2'이다 * 그리고이 질문은 I = 10 + 2 * '바로 그 이유이다; '** 나쁜 코드 ** : 즉각적이고 명확하게 그것이 무엇을하는지 명확히하지 않습니다. (코드가 괜찮다고 생각하고 C 연산자 우선 순위의 미묘함에 대한 지식이 귀하의 코드를 더 좋게 만드는 것임을 입증한다면 코드의 나머지 부분은 그 미세한 부분의 도움이 필요하다고 생각하는 부분이 무엇인지 * 잘못되었습니다. 눈에 띄지 않습니까?) –
두 가지 옵션은 제가 120 또는 100이되는 것입니다. 102는 이해가되지 않습니다. 'i * = (10 + 2)'또는'(i * = 10) + 2'입니다. – Art