전역 변수는 var
이고 함수는 foo
입니다.C에서 게시물 증가분을 사용하는 동안 변수 반환
long foo(){
return var++;
}
감사합니다 : C 표준 (나는 C99를 사용하여 컴파일하고있어) 내가 실행하려고하면 var
에 무슨 말한다면 내가 궁금하네요 (나는 그것이 나쁜 연습을 알고 있지만, 경우에 따라서는 불가피).
전역 변수는 var
이고 함수는 foo
입니다.C에서 게시물 증가분을 사용하는 동안 변수 반환
long foo(){
return var++;
}
감사합니다 : C 표준 (나는 C99를 사용하여 컴파일하고있어) 내가 실행하려고하면 var
에 무슨 말한다면 내가 궁금하네요 (나는 그것이 나쁜 연습을 알고 있지만, 경우에 따라서는 불가피).
짧은 대답은 :
이 var
의 복사본을 반환 한 후 즉시 이후 글로벌 var
을 증가합니다.
긴 않음 : 후위의
C11 6.5.2.4
"결과 ++ 연산자를 피연산자의 값 부작용 같이, 피연산자 객체의 값이다. 증분 .. "./-/ 결과의 값 계산은 의 부작용 전에 피연산자의 저장된 값을 업데이트합니다.
표준 5.1.2.3 "프로그램 실행"프로그램이 시퀀스 포인트가 발생하기 전에 모든 부작용 평가되어 있어야 함을 지정. (대략 시퀀스 포인트에 대해서는 here을 참조하십시오.)
return
문 다음에 시퀀스 포인트가 있습니다 (C11 6.8/4).
즉, var++
이라는 표현식은 main()의 코드가 계속되기 전에 완전히 평가된다는 것을 의미합니다.
귀하의 기계 코드이 의사 코드처럼 보일 것입니다 :
var
을 증가
var
의 로컬 복사본 (또는에서 등을 등록) 서브 루틴으로부터.var
"을 사용하십시오.대신 접두사 증가를 사용했다면 증가 동작은 복사본이 저장되기 전에 순서가 지정되었습니다.
위의 "기계어 코드"는 전역 변수의 ++가 스레드로부터 안전하지 않은 이유를 설명합니다. '저장소 복사'와 '증가'사이의 컨텍스트 전환 (예 : 읽기 또는 쓰기)이 예기치 않은 프로그램 동작을 일으킬 수 있습니다. – Lundin
foo()
은 var
의 현재 값을 반환하고 var
은 증가합니다. var++
으로
는 기본적으로이 같은 것입니다, 후행 증가입니다 : 대신 ++var
를 사용하는 경우는 반환 전에 변수 를 증가하므로
long foo(){
long tmp = var;
var++;
return tmp;
}
, 그것은 (증가 된 값을 반환합니다 그 값).
이전 값이 반환되고 증가 된 값이 저장됩니다. –
예. 예상대로 작동하는 것 같습니다. 나는 그것이 표준에 의한 판단을하는 것이 옳다고 생각하는지 모르겠습니다. – mgoszcz2
전역 변수만큼이나 괜찮습니다. –