2011-01-26 4 views
0
int x = 0; 
x^=x || x++ || ++x; 

그리고 x는 마지막에 3을 답니다.이 식을 분석하는 방법은? 조금 혼란스러워합니다. 고마워요.c, 비트 식, 논리식

+0

참조 : http://stackoverflow.com/questions/1895922/sequence-points-and-partial-order (시퀀스 포인트에 대한 지식이있는 것으로 가정) 및 http://stackoverflow.com/questions/4445706/post-increment - 및 - 사전 증가 개념 (수락 된 답변 참조). * 정확한 * 중복은 아니지만이 UB는 "잘 덮여있다". –

+0

[정의되지 않은 동작 및 순서 포인트] (http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points)도 참조하십시오. 그것은 "C++ - faq"에서 왔지만 여전히 일반적으로 적용됩니다. –

답변

7

이것은 정의되지 않은 동작입니다. 그 결과는 무엇이든 될 수 있습니다. ++xx ^= 사이에 sequence point이 없기 때문에 먼저 "완료"될 것이라는 보장은 없습니다.

+0

무엇 때문에? 당신은 x ++, ++ x 등등을 의미합니다 ... 계산 순서는 정의되지 않았습니다. –

+0

@Andy, 특히'^ ='에 걸쳐 있습니다. –

+3

시퀀스 포인트가 없다는 것은 사실이 아닙니다 :'||'연산자는 항상 시퀀스 포인트입니다. UB를 일으키는 유일한 두 가지 수정은 마지막'++ x'와'x^='입니다. – aschepler

2

정의되지 않은 동작입니다. 원하는 답을 얻을 수 있습니다.

+6

글쎄, 컴파일러가 원하는 모든 대답. –

-1

XOR 0은 0입니다. 그렇다면 ++는 2와 2가 같습니다. 그럼에도 불구하고 다른 답변에서 지적한 것처럼 시퀀스 포인트는 없습니다. 그래서 결과물은 무엇이든 될 수 있습니다.

+0

-1 : 아니오. 다른 답변을 참조하십시오. –

+1

xor 0이 0 인 것은 실제로 _0_입니다. 0,0 → 0, 0,1 → 1, 1,0 → 1, 1,1 → 0이다. 그건 좋은 시작이 아닙니다 :-) – paxdiablo

+0

수정. 그것을 지적 주셔서 감사합니다. – Ron

0

다른 사람들이 이미 언급했듯이 이것은 정의되지 않은 동작입니다. 하지만 왜?

C로 프로그래밍 할 때 명령문과 표현식간에 고유 한 차이가 있습니다. 표현식 평가는 어떤 경우에도 똑같은 관찰 결과를 제공해야합니다 (예 : (x + 5) + 2는 x + (5 + 2)와 같습니다). 반면 문은 부작용의 시퀀싱에 사용됩니다. 즉, 일반적으로 일부 메모리 위치에 쓰는 결과를 가져옵니다.

위의 내용을 고려하면 표현식을 표현식에 "중첩"하는 것이 안전하지만 표현식에 표현식을 중첩하는 것은 안전하지 않습니다. "안전한"이란 의미는 "놀라운 결과가 없음"을 의미합니다. 당신의 예에서

, 우리는 평가에 대해 가야하기 위해

x^=x || x++ || ++x; 

있나요? 이후 || 표현에 대해 작동하는지 여부는 중요하지 않습니다. (x || x ++) || ++ x 또는 x || (x ++ || ++ x) 또는 ++ x || (x || x ++). 그러나 x ++ 및 ++ x는 (C가 표현식으로 사용할 수 있음에도 불구하고) 진술이기 때문에 대수 추론을 진행할 수 없습니다. 따라서 여러 문장을 작성하여 명시 적으로 작업 순서를 표현해야합니다.