2017-05-19 3 views
0
#include <stdio.h> 

int main(void) { 

    int i; 
    i = 10; 
    i*= 10+2; 
    printf("%d",i); 
    return 0; 
} 

왜 다음 코드는 120이 아닌 102의 출력입니까?C 연산자의 실행 순서

+1

http://en.cppreference.com/w/c/language/operator_precedence에서 주문할

C 레퍼런스'난 = i가 (10 + 2) ' – d9ngle

+1

*'= 10 + 2'이다 * 그리고이 질문은 I = 10 + 2 * '바로 그 이유이다; '** 나쁜 코드 ** : 즉각적이고 명확하게 그것이 무엇을하는지 명확히하지 않습니다. (코드가 괜찮다고 생각하고 C 연산자 우선 순위의 미묘함에 대한 지식이 귀하의 코드를 더 좋게 만드는 것임을 입증한다면 코드의 나머지 부분은 그 미세한 부분의 도움이 필요하다고 생각하는 부분이 무엇인지 * 잘못되었습니다. 눈에 띄지 않습니까?) –

+0

두 가지 옵션은 제가 120 또는 100이되는 것입니다. 102는 이해가되지 않습니다. 'i * = (10 + 2)'또는'(i * = 10) + 2'입니다. – Art

답변

4

우선 순위에 따라 '+'가 * =보다 높기 때문에 10 + 2는 i * =가되기 때문에 발생합니다.

0

i*= 10 + 2; 

는 내가 * = 추가, 나머지는 우선 순위가 왼쪽에서 오른쪽으로되어

i= i * (10 + 2); 

에 대한 문법 설탕이며,이 라인에서 mult./division

+0

나는 왜 이런 일이 일어 났는지 이해하는 가장 분명한 방법 인 것처럼 왜이 것이 downvoted인지 잘 모르겠다. 아마도 두 사람이 혼란스러워서 복합 대입 연산자가 자신의 우선 순위를 갖고 실제로 설명하는 방식으로 분해되지 않는다는 사실에 착각 한 것입니까? –

+0

나는 투표하지는 않았지만 질문에 대답하지 않습니다. 설명은'* ='가'+'보다 낮은 우선 순위를 가졌지 만'* ='는 문법적 설탕이 아닙니다. – Peter

+1

이 미묘한 세부 사항으로 인해 투표가 가혹한데, 이것은 단지 통사론적인 설탕이 아닙니다. 6.5.16을 참조하십시오. E1 op = E2 형식의 복합 할당은 왼쪽 값 E1이 한 번만 계산된다는 점을 제외하면 간단한 할당 표현식 E1 = E1 op (E2)와 같습니다. 그게 그렇게 중요한 건가? 예, 피연산자를 평가하면 부작용이 발생합니다. 예를 들어'i'가 volatile로 선언되었다고 가정하십시오. 'i * = a + b;'는'i = i * (a + b);와 똑같지 않다. – Lundin

0

후 SUBST 10 + 2; 이 경우, i는 12로 곱한다. i = 10 * 12; 그러면 대답은 120이됩니다. 대답은

이 문제를 해결하려면 시도해보십시오.

i*= 10; 
i+=2; 
+0

이 답변에 추가 할 연산자 우선 순위에 대해 설명하고 이유를 설명해 주시겠습니까? –

0

코드 작업은 다음과 같습니다.

i= i*(10+2) 

는 그래서 120

같은 대답을 줄 경우 102처럼 네가 원하는 대답.

i=i*10+2