2013-09-16 2 views
0

배열이 0으로 채워지는 경우이 코드는 정의되지 않은 동작으로 연결됩니까? 또는 수 컴파일러 할이컴파일러가 명령문마다 여러 비교에서 UB 우선 순위를 확인합니까?

의 "와 비교 것 인 것처럼

uiaDigit[10]; 

for (sizeIndexI = 0; sizeIndexI < 10 && uiaDigit[sizeIndexI] == 0; sizeIndexI++) 
    ; 

내가 판독 방향 같은 것을 추측 것"첫째로 자동이 아닌 포인터 값을 확인 "덜 중요한 조건 즉, 몇 가지 검사 항상 왼쪽에서 오른쪽으로 읽히고 처음 false로 나옵니다. "

대부분의 구현에서 정의 된 동작입니까, 그렇지 않습니까?

그래야 컴파일러가 sizeIndexI이 10이되면 어쨌든 깨져 야합니다. 아니면 'uiaDigit [10] == 0'을 비교할 것입니까?

+0

모든 빠른 답변 주셔서 감사합니다. 누구나 참조 할 수있는 표준에서 본다면 정말 감사 할 것입니다. – dhein

+0

표준에서 평가 순서를 쉽게 찾을 수 있습니다. 우리는 그것을 찾을 수도 있고 그렇게 할 수도 있습니다. –

+0

실화, 나는'&&'도 시퀀스 포인트 기호라는 것을 알지 못했다. 그러나 어쩌면 나중에 시계가 스탠다드의 asnwer를 보는 것이 더 좋지 않을까요? – dhein

답변

1

&& 연산자의 경우 평가는 왼쪽에서 오른쪽으로 수행됩니다. 따라서 포인터 연산을 건너 뛰고 싶으면 표현식의 가장 오른쪽 부분에 놓으십시오.

C 표준 "6.5.13 논리적 AND 연산자"는 이진 비트 연산자 & 달리

4 & & 운전자 보장 좌우로 평가; 첫 번째 피연산자를 계산 한 후 시퀀스 포인트가 있습니다. 첫 번째 피연산자 이 0과 비교되면 두 번째 피연산자는 평가되지 않습니다. 왼쪽에서 오른쪽으로

+0

그리고 그것이 왼쪽에서 오른쪽으로 행해졌 고, 첫 번째가 틀리면 틀어 박히지 않을 것이라고 정의 된 행동입니다. – dhein

+0

@ 자이 비스 : 예, 그렇습니다. – alk

+0

@EricPostpischil : 문구를 수정했습니다. – alk

1

정확합니다, & &은 시퀀스 포인트입니다. 이 질문에 대한 답변보기 : Short circuit evaluation and side effects

+0

uiaDigit이 0으로 가득 차 있다고 가정하면 – Neil

+0

이 잠깐 멈춘 것입니다. 질문에서 비교를 방금 거쳤습니다. sizeIndexI <10 && uiaDigit [sizeIndexI] == 0 또는 uiaDigit [sizeIndexI] == 0 && sizeIndexI <10? – Neil

+0

나는 왼쪽에서 오른쪽으로 알지 못했기 때문에 그것을 경의를 표했습니다 – dhein

1

논리 및 (&&)은 평가되는 상기 제 피연산자 0 평가되면 short circuit을 것이다. 절의 C99 draft standard6.5.13논리적 AND 연산자 단락 4 말한다 (강조 광산) 다음 비트 이진 & 연산자 달리

, 보장 좌우로 평가 & & 연산자; 첫 번째 피연산자를 계산 한 후 시퀀스 포인트가 있습니다. 첫 번째 피연산자 이 0과 비교되면 두 번째 피연산자는 평가되지 않습니다.

그래서이 코드 : sizeIndexI < 10uiaDigit의 경계 외부에서 액세스 코드를 방지 할 수 0로 평가 때

sizeIndexI < 10 && uiaDigit[sizeIndexI] == 0 

uiaDigit[sizeIndexI] == 0을 평가하지 않습니다.

uiaDigit을 초기화하지 않으면 로컬 변수이므로 불확정 값이 포함되어 프로그램에 결정 가능한 동작이 없습니다.

1

표현식은 단락 평가를 통해 왼쪽에서 오른쪽으로 평가됩니다. 컴파일러는 평가 순서를 변경하지 않습니다. 하나의 조건이 다른 조건보다 UB로 이어질 가능성이 높기 때문입니다. 그것은 당신의 입장에서 바라는 생각입니다. 표준에서

, ISO/IEC 9899 : 201x N1570 초안 :

6.5.13 논리 AND 연산자

.... 비트 단위 바이너리 & 운영자는 달리

, & & 연산자는 왼쪽에서 오른쪽으로의 평가를 보장합니다. 두 번째 피연산자가 계산 된 경우 번째 피연산자와 두 번째 피연산자의 평가 사이에 시퀀스 포인트가 있습니다. 첫 번째 피연산자가 0과 비교되면 두 번째 피연산자는 평가되지 않습니다.

+0

정의되지 않은 동작의 존재 또는 존재 가능성에 따라 평가 순서를 결정하지 않는 컴파일러에 대해서는 확실하지 않습니다. 불행히도 최적화되지 않은 동작을 선택하는 것을 선호 할 수 있습니다. 최적화되지 않은 동작은 최적화 작업에 도움이되기 때문입니다. 의미 론적 규칙을 제외하고는 다른 모든 것을 희생하여 성능을 최적화하는 임무를 맡은 옵티 마이저라고 상상해보십시오. 정의되지 않은 동작을 발견하면 "Yippee, 다른 것들은 중요하지 않아서 제거 할 수 있습니다!"라고 말할 수 있습니다. –

+0

@EricPostpischil Hmm. 멀리 돌아가는. 여전히 오른쪽에서 왼쪽으로 평가하지는 않습니다. 그러나 UB가 가장 왼쪽에있는 경우 시나리오가 유효합니다. –