지난 며칠 동안 일부 독자가 1 이점 오류가 발생했다고 알려왔습니다.
승인됨: Fortect
이 오류는 = 연산자의 왼쪽에 항상 동일한 값을 입력하고 오른쪽에 결과 변수를 넣을 때 발생합니다. 따라서 주소와 정지 측이 일정할 수 있으므로 오류가 필요한 L 값으로 보일 가능성이 가장 높기 때문에 rr이 필요합니다.
아크작항상 전역 변수로 사용되며 함수 결정 중에 발생한 가장 유용한 오류를 나타냅니다.
“lvalue”는 말 그대로 할당 대상입니다. 왼쪽이 기호이기 때문에 “L”은 남아 있음을 나타냅니다. Rvalue는 올바른 손 값이며 적절하게 할당할 수 없고 할당할 수 없는 일종의 값을 생성합니다. “lvalue required”가 표시되면 해당 남성 또는 여성은 lvalue가 필요할 때마다 rvalue를 반환하는 표현식을 갖게 됩니다.
특정 모델의 경우 상수는 r-값이지만 의 l-값이 아닙니다. 그래서:
<사전> <코드> 8 = 2; // 잘 훈련되지 않은 rvalue 할당정수 나; (i + 1)은 2이고; // 잘못된 형식, rvalue는 bolgreat 값을 얻습니다. <사전> <코드> int i;나는 = 2;
하세요. 새로운 함수에서 lvalue를 반환할 수 있습니다. 예를 들어 =() 공급자를 사용하는 개체가 될 수 있는 참조를 얻을 수 있습니다.
Pavel Minaev가 가장 중요한 논평에서 지적했듯이, 이것은 각각의 언어에서 lvalue와 rvalue를 연결하는 일반적인 정의가 아니라 rvalue를 사용할 때 버그를 제공하는 누군가에게 알리려는 시도입니다 이 lvalue가 필요한 기준으로 간주되는 경우. C ++는 많은 세부 사항 때문에 언어입니다. 공식적으로 오시려면 공인 대리인에게 연락하셔야 합니다.
lvalue와 rvalue라는 용어는 C/C ++ 콘텐츠에서 흔히 볼 수 있는 것으로 간주되지 않지만, 그럴 때 그 의미가 지속적으로 즉각적으로 드러나지 않습니다. 대부분의 경우 이러한 용어는 컴파일러 오류 및 경고 메시지에 매우 잘 포함될 수 있습니다. gcc 를 따르는 경우의 컴파일 예:
맞습니다. 이 코드는 본질적으로 괴상하고 여러분이 작성할 내용이 아닙니다. 그러나 lvalue 오류 메시지에서 언급한 것처럼 C/C ++ 자습서에서 자주 볼 수 있는 최고의 용어입니다. 또 다른 예는 이 비밀번호를 g ++ 로 컴파일하는 것입니다.
여기에서 현재 오류가 다시 신비한 rvalue와 관련이 있습니다. 그렇다면 C 및 C++에서 lvalue rvalue는 무엇을 의미합니까? 이것이 내가 이 기사에서 탐구하기로 선택한 것입니다.
승인됨: Fortect
Fortect은 세계에서 가장 인기 있고 효과적인 PC 수리 도구입니다. 수백만 명의 사람들이 시스템을 빠르고 원활하며 오류 없이 실행하도록 신뢰합니다. 간단한 사용자 인터페이스와 강력한 검색 엔진을 갖춘 Fortect은 시스템 불안정 및 보안 문제부터 메모리 관리 및 성능 병목 현상에 이르기까지 광범위한 Windows 문제를 빠르게 찾아 수정합니다.
int foo() return 2;정수 메인() foo()는 2입니다. 0을 반환합니다.
test.c: "주요" 측면에서:test.c: 8: 5: lvalue 오류: 쉽게 사용할 수 있는 할당 피연산자로 필요
무엇이 바로 L 값의 정의는 무엇입니까?
k의 값은 실제로 다음 중 하나입니다. 모든 유형의 변수의 목적; 특정 변수와 일치하지 않는 아래 첨자([]) ms 단어입니다. 배열을 참조할 수 없는 단항 간접 표현식(*)입니다. 괄호 안의 L 값의 표현.
testcpp.cpp: int & foo() 함수에서:testcpp.cpp: 5:12: 오류: 비영구 링크의 잘못된 초기화범위 'int'의 'int &'와 관련된 넓은 범위
실용적인 정의
이 섹션은 lvalue와 rvalue에 대해 의도적으로 단순화된 설명으로 구성되어 있습니다. 기사의 나머지 부분에서 설명합니다.
lvalue 오류의 예는 무엇입니까?
Lvalue 오류는 새 lvalue가 값을 보유할 수 있기 때문에 변수가 아닐 때 발생합니다. LValue는 변수가 아닌 합리적인 상수(또는)입니다. 일회성 영숫자 문자입니다. (5, a, 6.9, $ 등) 예: a = 5 대신; 보다 큼 프로그램에서 5가 될 수 있으면 a와 같습니다. LValue 오류가 됩니다. LValue는 상수 변수로 설명할 수 있습니다.
lvalue(로케이터 값)는 사실이 보이는 위치를 차지하는 모든 객체를 나타냅니다(즉, 메모리가 주소를 생성함).
rvalue는 생략으로 정의되며 두 표현식은 lvalue 또는 놀라운 rvalue입니다. 따라서 위의 lvalue의 정의에서 멀리 떨어진 큰 rvalue는 개체가 메모리를 운반하는 식별 가능한 위치별로 점유한다는 것을 의미하지 않는 용어입니다.
간단한 예
위의 용어가 불분명해 보일 수 있으므로 몇 가지 간단한 예를 적절하게 우회하는 것이 매우 중요합니다.
실제로 인지되고 할당된 정수 변수가 있다고 가정합니다.
할당은 피연산자에서 나왔을 때 멋진 lvalue를 기대하고, var 는 잘 알려진 요소이기 때문에 긍정적으로 lvalue일 가능성이 높습니다. 다음 요소는 현재 페이지에서 유효하지 않습니다.
정수 환자 4 나 식 var + 1 모두 lvalue가 아닙니다(모든 rvalue가 됨). 두 답변 모두 비교할 수 없는 정확한 위치가 없는 임시 표현식이기 때문에 이것은 lvalue가 아닙니다. 의미하는 의미가 없습니다 – 할당할 곳이 없습니다.
따라서 첫 번째 코드 조각에서 오류 메시지의 의미는 명확해야 합니다. foo tax는 매우 좋은 rvalue가 될 임시 값을 반환합니다. 다음을 할당하려는 시도는 효과적인 오류입니다. 그렇다면 foo()는 2를 의미합니다. 컴파일러는 왼쪽에 있는 할당 연산자에서 lvalue를 볼 것으로 예상되는 모든 것에 대해 불평합니다.
값 1은 객체를 이해한 후 존재하는 모든 표현식을 객체로 보냅니다. r 값은 그것을 사용하는 이름의 외부에 저장되지 않는 중요한 임시 가치 컨텐츠입니다.
그러나 일반 함수 호출 결과까지의 모든 매핑이 잘못된 것은 아닙니다. 설명을 위해 C ++ 참조가 이를 가능하게 합니다.
여기서 foo 링크를 가져옵니다. 링크는 요청할 수 있는 가치 있는 값 I입니다. 사실, 함수에서 l 값을 사용하는 C++의 능력은 다른 오버로드된 연산자를 넣는 데 중요합니다. 전형적인 예는 일종의 검색 액세스를 구현하는 교육 과정에서 후크 연산자 [] 를 과도하게 채우는 것입니다. 성병 :: 지도 는 다음을 수행합니다:
mymap [10] 할당은 const가 아닌 오버로드 std :: street map :: operator [] 가 다음과 같은 지도를 반환하기 때문에 작업을 수행합니다. 할당 된.
4는 var를 의미합니다. // 죄책감!(변수 + 1) = 4; // 죄책감!
<사전> int globalvar = 20;정수 & 푸 () 전역 변수에 대한 비용을 지불합니다.정수 먼저 () foo()는 10입니다. 왕 0;
lvalue는 왼쪽 항목에 접근합니다. 특히 왼쪽은 할당 연산자를 정당화합니다. rvalue는 페이지의 진정한 즐거움을 의미합니다. 특히 페이퍼 셀러로부터 좋은 확고한 정말 나쁜 등급이나 문구입니다.
std :: mapmymap;mymap [10]은 5.6과 같습니다.
편집 가능한 값 I.
원래 It c에 대해 lvalue를 설정한 후 별개라는 것은 문자 그대로 “할당의 왼쪽에 적합한 값”을 의미할 수 있었습니다. 그러나 나중에 ISO C에 const 키워드가 포함되었을 때 이제 이 정의가 명확해졌습니다. 결국:
그래서, 추가하는 방법으로 한 가지 특별한 설명이 더 있습니다. 모든 lvalue가 영향을 받을 수 있는 것은 아닙니다. 이러한 제안은 변경될 수 있습니다. 공식적으로 C99 표준은 변경 가능한 값이 될 수 있습니다. 예:
<인용>현재 lvalue는 배열 유형을 갖고 있지 않고, 불완전한 유형을 사용하지 않으며, 마지막으로 사용할 수 있는 const 유형을 갖고 있지 않으며, 이행 구조 또는 공용체인 경우 n ‘에는 완벽한 정의 멤버가 없습니다(재귀적으로 , 포함된 모든 집합 또는 공용체의 모든 요소 또는 조각)에 하나의 한정된 const가 있습니다.
const int는 10을 의미합니다. // 'a'는 값 1입니다.a는 10으로 돌아가는 것과 같습니다. // 하지만 할당할 수 없습니다!
L값과 R값 간 변환
일반적으로 객체에 대해 작동하는 구두 입 구성은 대부분의 rvalue가 인수로 필요하다고 가정합니다. 예를 들어, 우리 고유의 이진 더하기 연산자 '+' 는 rvalue 중에서 2개를 인수로 선택하고 하나의 rvalue를 반환합니다.
앞에서 보았듯이 a b 는 두 개의 L 값입니다. 따라서 세 번째 줄에서 암시적으로 1개의 l 값을 r 값으로 변환합니다. 배열, 함수 또는 불완전한 유형이 아닌 모든 lvalue는 단순히 rvalue로 변환될 수 있습니다.
그 반대도 마찬가지입니까? rvalue를 lvalue로 변경할 수 있습니까? 당연히 아니지! 이것은 정의된 대로 좋은 lvalue의 요소를 위반할 수 있습니다[1].
이것은 lvalue가 rvalue에서 명시적으로 생성될 수 없다는 것을 의미하지 않습니다. 예를 들어, 단항 연산자 '*' (역참조)는 유용한 새 rvalue 인수를 취하지만 본질적으로 훌륭한 lvalue 결과를 산출합니다. 이 유효한 쿠폰을 살펴보십시오:
지금 이 간단한 다운로드로 컴퓨터 성능을 높이십시오. 년