2012-03-30 3 views
2
a[i] = i++; 

위의 코드가 작동하지 않는 이유는 무엇입니까?왜이 코드가 다음과 같지 않습니까? a [i] = i ++; 작업?

위의 코드에 어떤 문제가 있습니까? 나는 나의 지식을 향상시키기 위해이 질문을하고있다.

+1

어떤 오류가 발생합니까? – Habib

+0

모든 변수를 선언 했습니까? – Ben

+2

당신은 무엇을 얻고 있는지 또는 예상되는 결과를 얻지 못하고 있습니까? 무엇을하고 있습니까? – Vijay

답변

9

ISO 표준에 따르면 사용자가 개입하는 시퀀스 포인트없이 변수를 두 번 이상 변경 (또는 변경 및 사용) 할 수 없다고되어 있기 때문입니다.

ia[i]에 사용하고 ii++으로 변경하는 사이에 시퀀스 포인트가 없습니다. 하여 기능 지정자의 평가와 실제 인수 함수 호출과 실제 통화 사이

  • :

    C11에서 시퀀스 포인트의 목록 부속서 C에 설명되어 있습니다 (정말 C99 이후 많은 것이 변경되지 않음) .

  • 다음 연산자의 첫 번째 피연산자와 두 번째 피연산자의 평가 사이 : 논리 AND & &; 논리 OR ||; 쉼표.
  • 조건부? : 연산자의 첫 번째 피연산자와 두 번째 및 세 번째 피연산자 중 어느 것이 평가되는지 사이에 평가됩니다.
  • 완전한 선언자의 끝 : 선언 자;
  • 전체 표현식과 평가할 다음 전체 표현식 평가 사이. 다음은 완전한 표현식입니다 : 초기화; 표현식 문의 표현식. 선택 문 (if 또는 switch)의 제어 표현; while 문 또는 do 문을 제어하는 ​​표현; 각각의 for 문에 대한 표현; return 문에서의 표현식.
  • 라이브러리 함수가 반환되기 직전입니다.
  • 각 형식화 된 입출력 함수 변환 지정자와 연관된 조치 후.
  • 비교 함수에 대한 각 호출 직전과 직후에, 그리고 비교 함수 호출과 해당 호출에 대한 인수로 전달 된 개체 이동 사이.

5.1.2.3 Program execution 상태 A는 이전 또는 이후에 B 서열 때

평가 A 및 B는 불확실 서열화되어 있지만, 어느 불특정이다.

표현 A와 B의 평가 사이의 순서 점의 존재는 B와 관련된 모든 값 계산 및 부작용 전에 A와 관련된 모든 값 계산 및 부작용이 순서화된다는 것을 의미합니다.이러한 unsequenced 부작용이없는 순서의 발생하면

식의 하위 표현식의 여러 허용 개의 순서가있는 경우

, 동작이 정의되지 : 6.5 Expressions 거의

섹션 정확한 케이스를 커버 .

이 단락은 i = ++i + 1;a[i++] = i;과 같이 정의되지 않은 명령문 표현식을 렌더링하는 반면 i = i + 1;a[i] = i;은 허용합니다.

1

예상대로 작동하지 않을 수 있습니다. 문제는 i이 할당 전에 증가하는지 여부가 명확하지 않은 경우이며, 그렇다면 a[i]은 배열의 다음 항목을 참조합니다.

귀하의 질문은 매우 간결한 것이므로 더 자세한 정보를 원할 경우 확대 할 수 있습니다. 그러나 구문이 할당하는 a의 요소를 정확히 알기는 어렵습니다.

+0

아니요, 작동하지 않습니다. * 정의되지 않은 동작 *입니다. –

+3

@ Adam : 표준에 의해 정의되지 않은 동작만으로 작동하지 않는다는 것을 의미하지 않습니다. 구현에 따라 매우 효과적 일 수 있습니다. (*가 작동하지 않는다는 사실을 두려워하지 마십시오 *는 끔찍한 설명이며 개발자가 기술적 인 문제를 설명하려고 시도해서는 안됩니다.) –

관련 문제