2017-01-31 1 views
1

표준에 따르면 다음 두 표현식이 정의되지 않은 동작입니까?[] - 연산자의 덧셈 및 증분식

int a = 1, b = 1; 
int c[] = { 1, 2, 3, 4, 5 }; 

// Do the following expressions lead to Undefined Behavior ? 
c[a++]; // (1) 
c[a+b]; // (2) 
+3

'a'는 배열이 아닙니다 .... –

+0

'a [a ++];는 컴파일러 오류 – NathanOliver

+0

을 의미합니까? int c [] = {1, 2, 3, 4, 5}; –

답변

5

아니요, 현재 형태로는 정의되지 않은 동작을하지 않습니다. 일 수도 있고 일 수도 있으므로 시퀀스 포인트 위반은 없습니다. a 기존 인덱스 값에 사용되는 경우 c[a++];

  • a은 (후행 증가 연산자) 부작용으로 증가된다.
  • c[a+b];이 변경되지 않았습니다.a+b이 배열의 유효한 인덱스입니다. 는 A 또는 B 또는 A와 B의 합이 배열의 크기보다 큰 경우
+0

C++ 14 iso 표준 섹션'1.9.15'에 혼란을 일으키는 예제가 있습니다. http://www.open-std.org/jtc1/sc22/ wg21/docs/papers/2014/n4296.pdf 하지만이 섹션을 오해 할 수도 있습니다. – SebNag

+0

@SebNag이 예제는'v [i ++]'의 결과를 사용하여'i'를 변경합니다. 이것은'i'의 두 개의 순차적 변경을 산출합니다. Btw, C++ 14 표준은 N4141이 될 것입니다 (+ - 일부 오자/레이아웃 수정이있을 수 있습니다). N4296은 중간 초안입니다. –

+0

@SebNag 이것은 다른 경우입니다. 여러분은'i'에 포스트 증분을 사용하고 있습니다 .__는 RHS 값을'i'에 다시 할당합니다. 이제, 부작용의 실행과 과제 사이에는 순서 지점이 없으며 문제는 어디에 놓여 있습니다. –

1

당신은 정의되지 않은 동작을 얻을 수 있습니다

int a = 1, b = 1; 
int c[] = { 1, 2, 3, 4, 5 }; 

c[a++]; // (1) a = 2 
c[a+b]; // (2) a + b = 3 

cout << c[a] << endl; // 3 
cout << c[a+b] << endl; // 4 
cout << a << ", " << b << endl; 

당신이 볼 수 있듯이 c[a + b] = c[3] 때문에 UB가하지 않은 배열의 요소입니다.