2013-07-15 3 views
-3

here 해당 증분 & 감소 연산자의 우선 순위가 삼항 연산자보다 많지만 아래 코드에서 b와 c 모두의 값이 증가하지 않지만 b는 증가한다연산자 우선 순위 및 평가 혼동

int a=1,h; 
h = (a==1)?++b:++c; 
printf("%d%d",b,c); 

또는 내가 몇 가지 개념 실수를하고 있다면 설명해주십시오

++i&&++j||++k; // why not all the increment and decrement operator executes first 

같은 진술과에있는 죄송합니다 (또는 c가 증가되고 조건이 거짓입니다) (이것은 중복 된 다음 원래의 질문에 저를 리디렉션하십시오 경우, 내가 하나를 발견하지 않았다) h = (a==1)?++b:++c;를 들어

+15

글쎄, 나는이 혼란이 이와 같은 코드 작성에 대한 강력한 억지력이되기를 바란다. –

+4

오, "너무 현지화 된", 어디로 갔습니까? : –

+0

@sumitb 3 자 연산자가 무엇을하는지 명확하게 이해하고 있습니까? – Nbr44

답변

2

C11 6.5.15 조건부 운영자 P4 (내 강조

을 참조 을 멍청한 놈 오 첫 번째 피연산자가 계산됩니다. 평가와 두 번째 또는 세 번째 피연산자 (평가 된 것 중 하나)의 평가 사이에는 시퀀스 포인트가 있습니다. 두 번째 피연산자는 이 처음 0과 같지 않은 경우에만 계산됩니다. 세 번째 피연산자는 첫 번째 피연산자가 0과 비교되는 경우에만 평가됩니다.

이 내용은 ++b++c 중 하나만 실행된다는 관찰이 정확함을 확인했습니다.

++i&&++j||++k;에 대해서는 C11 섹션 6.5.13, 6.5.14를 참조하십시오. 논리적 OR 및 AND 연산자는 왼쪽에서 오른쪽으로 평가하고 결과가 알려지면 추가 표현식의 평가는 건너 뜁니다. 따라서 한 번 표현식이 &&에 대해 0으로 평가되면 표현식이 ||에 대해 0이 아닌 것으로 평가되면 계산됩니다.

1

3 진 연산자는 조건 피연산자와 피연산자만을 참으로 계산합니다. 귀하의 케이스에있는 ++c 부분은 전혀 평가되지 않습니다.

두 번째 경우는 ||&& 연산자가 "단락"이라고하는 작업을 수행하기 때문에 모든 피연산자가 평가되지는 않습니다. 즉, 전체 표현식이 더 이상 결과를 변경할 기회가 없기 때문입니다 , 나머지 피연산자는 평가되지 않습니다.

4

조건부 (?:), 논리 곱 (&&) 및 논리합 (||) 연산자 지연 및 검이고;. 결과를 생성하는 데 필요한 피연산자 만 평가합니다.

조건부 연산자의 경우 두 분기 중 하나만 평가합니다. 조건이 true로 평가되면 첫 번째 조건, 또는 거짓으로 평가되는 경우 두 번째 조건

논리 곱셈 연산자는 결과가 false 일 때 왼쪽식이 false로 평가되면 오른쪽 식을 계산하지 않습니다. 논리적 분리 연산자는 비슷한 방식으로 작동합니다. 차이점은 x에 관계없이 왼쪽 편이 참일 경우 이 항상 true 인 경우 오른쪽면을 계산하지 않습니다.


; 오버로드 된 && 또는 ||을 다루지 않는 한. 오버로드 된 연산자는 피연산자에 대한 지연 평가를 수행 할 수 없습니다.

+0

@ShafikYaghmour that 결코 발생하지 않습니다. 두 가지를 평가하지 않습니다. –

+0

아. 조건부 연산자를 오버로드 할 수 없으므로 적용되지 않습니다. 다시 말하겠습니다. –

+0

+1 이제 완전히 완벽합니다. –

0

우선 순위는 평가 순서를 제어하지 않습니다.. 연산자와 피연산자를 함께 그룹화하는 방법 만 제어합니다.

||&& 연산자는 왼쪽에서 오른쪽으로 평가해야하며 둘 다 "단락 회로"연산자입니다. 표현식의 값이 왼쪽 표현식으로 결정될 수 있다면, 오른쪽 표현식은 전혀 평가되지 않을 것입니다. a++의 결과는 그 결과에 관계없이 b++ && c++의 결과에 해당 될 것이다 영이 아닌 경우

는 그래서

a++ || b++ && c++ 

같은 표현식을 부여하므로 우측은 전혀 계산되지 않는다 .