2014-01-17 1 views
7

제목이 다소 모호합니다.이 질문을 정의하는 방법을 모르겠습니다.이 C 명령문의 순서가 잘 정의되어 있습니까?

다음 코드와 함께 할 수있다

: 루프에 대한 순차적으로 실행 보장에

for (match   = root, 
    m_matchBase = match->requestedBase, 
    m_matchLength = match->length; 

    match != NULL; 

    match   = match->next, 
    m_matchBase = match->requestedBase, 
    m_matchLength = match->length) 
{ 
    if (m_matchBase <= m_base && m_matchBase + m_matchLength > m_base) 
     break; 
    // other stuff... 
} 

가 문 있습니까?

예를 들어, match = match->next 이후에 m_matchBase = match->requestedBase이 계속 실행됩니까?

+1

예, [더 많은 정보] (http://stackoverflow.com/questions/54142/how-does-the-comma-operator-work) –

+0

http://stackoverflow.com/questions/52550/what -does-the-operator-do-in-C# 52558 – clcto

+0

이 C 또는 C++입니까? 하나를 선택. 제목에 'C'만 언급 했으므로 지금은 내가 말한 내용을 의미한다고 가정하고 태그를 적절하게 수정하겠습니다. –

답변

8

예, 여기에 사용되는 쉼표 연산자가 작업 순서를 지정합니다. 즉, match->next이 null이되면 루프가 충돌 할 가능성이 높습니다.

+2

크래시가 멋진 catch – bolov

+0

멋진 캐치! 감사 –

2

예.

쉼표 연산자의 왼쪽 피연산자는 void 식으로 계산됩니다. 그 평가와 오른쪽 피연산자 사이의 시퀀스 포인트는 입니다. 그런 다음 오른쪽 피연산자가 계산됩니다. 결과에는 유형 및 값이 있습니다.

&& 연산자에도 시퀀스 포인트가 있습니다.

3

예, C++ 참조 표준 11 (5.18) : 쉼표로 구분 식의 쌍은 왼쪽에서 오른쪽으로 계산된다

; 좌측 식은 discarded- 값 식

5

좌우 각 평가 후 시퀀스 포인트있을 것이다에서 평가 될 것이다식이다. C 초안에서 선언하지 않고 문에 대한 의 문법에서 C99 표준 섹션 6.8.5반복 문은 다음과 같습니다

(표현 선택 하, 표현 선택 하, 표현 opt) 명세서

따라서각 표현식 세트의은 구분 기호와 반대로 comma operator이 될 것입니다. 즉, 할당은 왼쪽에서 오른쪽으로 평가됩니다. 이 절에 덮여 6.5.17콤마 연산자 말한다 :

콤마 연산자의 왼쪽 피연산자 공극 표현으로 평가된다; 평가 후 시퀀스 포인트가 있습니다.그런 다음 오른쪽 피연산자가 계산됩니다. 결과가이 유지 보수 코드는 또 다른 질문입니다 여부의 유형과 값

을 가지고, 그것은 중요하다 match>next 반환 후속 하위 표현식에서 undefined behavior를 호출합니다 NULL 때. 아마도 이것은 놓치기 쉽고 현재 양식을 확인하기가 어렵 기 때문에 이것이 스타일에있어서 좋지 않은 선택입니다.

관련 문제