2013-03-25 3 views
6

전역 변수는 var이고 함수는 foo입니다.C에서 게시물 증가분을 사용하는 동안 변수 반환

long foo(){ 
    return var++; 
} 

감사합니다 : C 표준 (나는 C99를 사용하여 컴파일하고있어) 내가 실행하려고하면 var에 무슨 말한다면 내가 궁금하네요 (나는 그것이 나쁜 연습을 알고 있지만, 경우에 따라서는 불가피).

+0

이전 값이 반환되고 증가 된 값이 저장됩니다. –

+0

예. 예상대로 작동하는 것 같습니다. 나는 그것이 표준에 의한 판단을하는 것이 옳다고 생각하는지 모르겠습니다. – mgoszcz2

+1

전역 변수만큼이나 괜찮습니다. –

답변

9

짧은 대답은 :

var의 복사본을 반환 한 후 즉시 이후 글로벌 var을 증가합니다.

긴 않음 : 후위의

C11 6.5.2.4

"결과 ++ 연산자를 피연산자의 값 부작용 같이, 피연산자 객체의 값이다. 증분 .. "./-/ 결과의 값 계산은 의 부작용 전에 피연산자의 저장된 값을 업데이트합니다.

표준 5.1.2.3 "프로그램 실행"프로그램이 시퀀스 포인트가 발생하기 전에 모든 부작용 평가되어 있어야 함을 지정. (대략 시퀀스 포인트에 대해서는 here을 참조하십시오.)

return 문 다음에 시퀀스 포인트가 있습니다 (C11 6.8/4).

즉, var++이라는 표현식은 main()의 코드가 계속되기 전에 완전히 평가된다는 것을 의미합니다.

귀하의 기계 코드이 의사 코드처럼 보일 것입니다 :

  • 1.
  • 복귀와 함께 글로벌 var을 증가

    • 스토어 스택에 var의 로컬 복사본 (또는에서 등을 등록) 서브 루틴으로부터.
    • "copy-of-var"을 사용하십시오.

    대신 접두사 증가를 사용했다면 증가 동작은 복사본이 저장되기 전에 순서가 지정되었습니다.

  • +0

    위의 "기계어 코드"는 전역 변수의 ++가 스레드로부터 안전하지 않은 이유를 설명합니다. '저장소 복사'와 '증가'사이의 컨텍스트 전환 (예 : 읽기 또는 쓰기)이 예기치 않은 프로그램 동작을 일으킬 수 있습니다. – Lundin

    2

    foo()var의 현재 값을 반환하고 var은 증가합니다. var++으로

    4

    는 기본적으로이 같은 것입니다, 후행 증가입니다 : 대신 ++var를 사용하는 경우는 반환 전에 변수 를 증가하므로

    long foo(){ 
        long tmp = var; 
        var++; 
        return tmp; 
    } 
    

    , 그것은 (증가 된 값을 반환합니다 그 값).