2013-08-14 6 views
0

나는 운영자의 우선 순위 사이에 혼란스럽고이 진술이 어떻게 평가 될지 알고 싶습니다.C 프로그래밍 : 운영자 우선 순위 사이의 혼동

  1. k>40가 확인해야합니다 0
  2. k==35 발생해야하는 확인하고 어느해야한다 : 나는 printfk을 테스트입니다 때

    # include <stdio.h> 
    
    int main() 
    { 
        int k=35; 
        printf("%d %d %d",k==35,k=50,k>40); 
        return 0; 
    } 
    

    여기 k 내 생각은, 초기 값 (35) 한 것입니다 결과는 1

  3. 마지막으로 50은 k으로 지정되어야하며 출력은 50
  4. 이어야합니다.

최종 출력은 1 50 0이어야하며 출력은 0 50 1이어야합니다.

+2

이는 '정의되지 않은'동작의 예입니다. –

+0

운영자 우선 순위는 여기에서 부적합합니다. GCC 버전 4.4.3에서 – harold

+0

gcc 버전 4.4.3은 '0 50 0'입니다. ( –

답변

0

함수 인수가 평가되는 순서가 지정되지 않습니다. 그들은 어떤 순서로 평가 될 수 있습니다. 컴파일러가 결정합니다.

6
C99 초안 표준 섹션 6.5 단락 3에서 더 나은 최적화 컴파일러를 수 있기 때문에 당신은 그것을 평가 순서는 C에 지정되지 않은 undefined behavior이기 때문에이 프로그램의 출력에 의존 할 수

:

연산자 및 피연산자의 그룹화는 제외) syntax.74 의해 지시된다 & &, || (함수 호출 (대해) 이상 를 지정된, :, 및 콤마 연산자)의 평가 순서 서브 표현식 및 부작용이 발생하는 순서는 모두 unsp ecified. 당신이 k의 값을 액세스하고 같은 sequence point에에 할당되기 때문에

는 또한 정의되지 않습니다. 객체가 표현의 평가에 의해에서 가장 번 수정의 저장된 값 를 가진다 이전 및 다음 시퀀스 지점 사이

: 초안 표준 섹션 6.5 단락 2에서. 또한 이전 값 은 저장할 값을 결정하기 위해 읽기 전용이어야합니다.

가 정의되어 있지 않다고로 다음 코드 예제를 인용 :

i = ++i + 1; 
a[i++] = i; 

업데이트

함수 호출에 쉼표가 일련의 점으로 행동 여부에 관한 의견이 있었다 또는 아니. 우리가 절을 보면 6.5.17 Comma operator 단락 2는 말한다 :

쉼표 연산자의 왼쪽 피연산자는 무효의 표현으로 평가된다; 평가 후 시퀀스 포인트가 있습니다.

그러나 단락 3 말한다 :

예 구 (본 항에서 설명) 콤마 연산자로 나타낸 바와 쉼표가 별도의 항목에 사용되는 경우 컨텍스트에 표시 할 수없는 목록 (예 : 함수에 대한 인수 또는 초기화 자 목록).

이 경우 쉼표는 시퀀스 포인트를 도입하지 않습니다.

0

이것은 undefined behaviour입니다.

값을 얻을 수 있습니다. 두 번의 연속 실행에서 sequence points이 부족합니다. 경고에 대한 엄격한 수준을 높이면 warning: operation on ‘k’ may be undefined이 표시됩니다.