2016-09-22 7 views
2

나는 결과가 2 + 3 + 4 = 9 일 것으로 예상되지만 출력은 내가 정의되지 않은 행동에 있다는 것을 알고 10c의 (a = a + 1) + (a = a + 1) + (a = a +</p> <pre><code>int a=1; printf("%d",(a=a+1)+(a=a+1)+(a=a+1)); </code></pre> <p>내가 GCC로이 코드를 컴파일하고 실행

입니다 (++a)+(++a)+(++a), 왜냐하면 3 개의 ++ 부작용이 모두 (++ a)가 평가되기 전에 실행될 수 있기 때문입니다.

하지만 a=a+1의 값은 정확히 a이며 할당이 평가 된 것 같습니다. 따라서 컴파일러는 먼저 a=a+1 세 개를 처리 할 수없고 a=a+1이 계산 된 후에 a=a+1 값으로 변수 a의 값을 사용합니다.

C 표준에 따라 어디 잘못되었는지 알고 싶습니다.

+2

코드는 실용적이지 않습니다. 시퀀스 포인트 등 –

+0

나는 컴파일러를 연구 중이며 컴파일러가 C 표준에 따라 작동하는 방법을 알고 싶다 – zzh1996

+1

"그러나 a = a + 1의 값은 할당이 평가 된 후 정확히 무엇인지 생각합니다." 왜 그렇게 생각하니? 왜 그것이'++ a '와 다른 점이 있을까요? (힌트 : 그렇지 않습니다.) – rici

답변

1

할당 연산자가 시퀀스 포인트가 아닙니다. a은에 대한 의미에서과 동일한 식별자 (예 : 더 복잡한 것으로 확장 될 수있는 매크로 인수가 아님)이고 원자 유형 (C11)이없는 것으로 가정하면 a=a+1입니다.

이 질문을 ++ 연산자 시퀀스 포인트 질문 중 하나의 중복으로 표시하고 싶었지만이 질문 양식이 왜 다른지에 대한 질문 인 것 같습니다.