2017-12-02 5 views
-2

오늘까지 나는 C++ 연산자와 precedence을 이해했다고 생각했습니다.부울을 가진 C++ 접미사 연산자 우선 순위 AND

int i = 0, j = 0 
i++; 
j++; 

cout << i << ' ' << j << endl; 

은 물론, 우리가 ij의 출력 값은 1과 1, 각각 것으로 예상 : 나는 당신에게 다음과 같은 간단한 코드를 제공합니다. 이제 증분을 한 줄에 입력하면 어떻게됩니까?

int i = 0, j = 0 
i++ && j++; 

cout << i << ' ' << j << endl; 

부울 연산자는 결과에 아무런 영향을 미치지 않습니다. 그러나 우리의 결과는 놀랍게도 i = 1j = 0입니까? 그럼 여기서 뭐하는거야?

나에게 이상한 점은 후위 증가에서 접두사 증가로 전환하거나 다른 부울 연산자를 사용하면 결과가 예상대로입니다. 예 :

//Expected i=1, j=1 
++i && ++j; 

//Expected i=1, j=1 
i++ || j++; 

P. 나는 한 줄은 다음과 같습니다에 올바른 사용 사례는 두 변수를 업데이트 할 것을 알고 :

i++, j++; 

그러나 호기심이 날 최고의있어하고 부울 AND 연산자를 사용하여 왜 지금 내가 궁금하네요 것은 놀랍지 결과가 있습니다.

+6

로 평가되는 경우가이 식의 우변을 평가 안 번째 코드의 출력이 아닌 - 다른 요인은 && 오퍼레이터가 "단락"이 정의되어있다 당신이 주장하는 것 : https://ideone.com/61YZL6 –

+0

그는 && 표현식의 왼쪽이 0으로 평가 될 것으로 기대하고 있다고 생각합니다. 그렇기 때문에 오른쪽을 점검 할 필요가 없습니다. –

+3

"올바른 두 변수를 모두 업데이트하려면 "is ++; j ++; 그리고 당신은 그것들을 한 줄에 넣는 것으로부터 아무것도 얻지 못합니다. –

답변

1

i++ 인크 리먼 트 i 그러나 표현식의 결과는 0입니다 (증가분은 부작용 임). 따라서 i++ && j++ 표현식은 && 연산자의 오른쪽을 평가하지 않습니다.

선행 증가 연산자 ++i의 결과는 증가 된 값입니다. 따라서 ++i && ++j도 증가하여 j이됩니다.

아무 것도 우선 순위와 관련이 없습니다. 가장 중요한 것은 사전 및 사후 증가 연산자 간의 차이점을 정확히 이해하는 것입니다. 왼쪽은 0

+0

감사합니다. Michael, 왼쪽면이 0으로 계산되므로 'j'의 후행 증가를 평가하지 않습니다. – Max