반응형

Reference Variable

(c++11, L-value reference)

L-value, 기존 메모리 공간(변수) 대한 별명을 만들어 변수처럼 쓴다,

별명만 붙이는 것이기 때문에, 메모리 주소는 동일한 공간을 쓴다

Reference(참조)라는 뜻에서 있듯이, 어떤 변수를 참조하게 만들어 준다

typedef 다르다(typedef 자료형에 별명을 주는것)

 

선언법

 

자료형& 레퍼런스식별자 = 변수;

 

 

pass by reference 할때 포인터 대신에 사용할 있다,

하지만 포인터와는 다르다, 구지 포인터를 Reference Variable 비슷하게 쓴다면

 

자료형 * const ptr = &변수;

비슷한 모양이다, 선언시에 정해진, 가리키고 있는 변수의 주소를 수정 없다

그러나 포인터는 주소가 가리키는 값에 접근하기 위해 indirection operator(역참조)* 사용하지만

Reference Variable 역참조를 없다,

 

int main()

{

    int a = 8;

    int &a_ref = a; // 포인터와 다르게 &a 대입하지 않음

 

    std::cout << a_ref << std::endl; // 결과는 8 나옴

    return 0;

}

 

R-value Reference

(c++11)

c++11 부터 move semantic 개념이 도입되면서, 기존 refernce variable

L-value refernce, R-value reference 나뉘게 되었다

 

선언법
 

자료형&& 레퍼런스식별자 = R-value;

 

 

비교 연산자(&&)와는 아무 관련 없음

R-value 대입할 있다, 식별자가 없는 값들만 대입 있다.

 

R-value, 즉 곧 사라지는 값, 식별자가 없는 값만 대입 할 수 있다.

 

 

R-value reference parameter

 

 

이때 20번라인 doSomething L-value 인자로 받고

21번라인 doSomething R-value 인자로 받았다

반응형
반응형

C언어, C++11이전까지의 L-value, R-value

 

L-value : locator value, 저장 장소 위치의 값, 할당 연산자 기준으로 왼쪽에 오는 값

R-value : value of an expression, 수식의 값, 할당 연산자 기준으로 오른쪽에 오는 값

 

 

 

C++11 이후

출처: https://docs.microsoft.com/ko-kr/cpp/cpp/lvalues-and-rvalues-visual-cpp?view=vs-2019

glvalue, xvalue, prvalue 개념이 새로 생겼다 일단 

 

 

L-value와 R-value 부터 정리하면

 

 

위 코드에서 left_value, right_value, result 는 모두 L-value 로서 식별자(변수이름)를 가지고 다른 데이터를 복사해서 자신의 상태(값)를 변경 할 수 있다.

3, 7, 0 은 모두 R-value 이다.

R-value는 다른 데이터의 메모리를 복사할 공간이 없거나, 식별자가 따로 존재하지 않기 때문에 대입이 불가능하다.

또한 3,7,0 은 식별자가 따로 존재 하지 않기 때문에, 따로 변수처럼 접근 할 수 없어, 일시적인 값, 사라지는 값이라고 할 수 있다

 

 

L-value는 Locator value, 존재하는 메모리를 식별할 수 있는지의 여부, 즉 식별자가 있어야 하고, 식별자를 가지고 다른 값을 복사 받을 수 있으면 L-value 라고 할 수 있다.

그러나 배열타입, 불완전한타입, const 타입은 Lvalue 로 올 수 없다

 

R-value는 value of an expression, 즉 수식을 계산한 후의 값이다, 위에서 left_value + right_value 는

수식 (left_value의 값) + (right_value의 값)의 결과 값 10 이 되고

10( left_value + right_value 의 결과 값 )은 식별자가 존재 하지 않기 때문에 R-value인 것이다 

 

 

 

이제  glvalue, xvalue, prvalue 를 파헤쳐 보면

크게 식별자의 유무에 따라서 나눌 수 있고

식별자 있음 : glvalue( xvalue, lvalue)

식별자 없음 : prvalue

 

move의 가능 여부 에 따라서 나눌 수 있다

move 가능 : rvalue(xvalue, prvalue)

move 불가능 : lvalue

 

여기서 move의 가능이란, move semantics 가 가능하다 또는 값이 메모리에서 이동 될 수 있는것을 말한다.

 

 

위 MSDN 정리 그림을 https://docs.microsoft.com/ko-kr/cpp/cpp/lvalues-and-rvalues-visual-cpp?view=vs-2019

다시 표시하면

이렇게 볼 수 있다

 

 

lvalue : identity 가짐, move 없는 표현식들

 

 

xvalue : identity 가짐, move 있는 표현식들

 

 

prvalue : identity 안가짐, move 있는 표현식들

 

 

glvalue : identity 가지고 있는 표현식들(lvalue, xvalue)

 

 

rvalue : move 있는 표현식들(prvalue,xvalue)

반응형
반응형

expression(표현식)

프로그램 언어에서 값을 나타내기 위해서, 변수나 상수, 연산자로 구성된식, 표현식은 항상 결과(반환)값을 갖음

  1. 일차식
  2. 상수
  3. 괄호식
  4. 전위연산자 수식
  5. 후위연산자 수식
  6. 단항식
  7. 이항식
  8. 삼항식
  9. 할당 수식

 

 

1. 일차식

  • 식별자,변수이름(identifier)

    • iNum, fLength, INT_MAX 등등

    • 연산자(operator) 없이 오직하나의 피연산자(operand) 이루어진 가장 기본적인 형태

 

2. 상수(Constants)

    • 5, 3.14, 'A', "HelloWorld" 등등

 

3. 괄호식(Parenthetical Expression)

    • (2*3)+4, (a = 23+b*) 등등

 

4. 전위 연산자 수식

  • 연산자(operator)가 피연산자(operand) 앞에 오는 형태

  • x = ++a;

    1. a = a+ 1; // a 값에 + 1 값을 a 대입한다
    2. x = a // x a 값을 대입한다,
    3. ++a a 1증가한 이후의 값이다, 변수의 참조보다 먼저 연산을 수행

 

5. 후위 연산자 수식

  • 연산자(operator)가 피연산자(operand) 뒤에 오는 형태

  • x = a++;

    1. x = a // x a 값을 대입한다
    2. a = a + 1 // a 값에 +1 값을 a 대입한다.
    3. a++ a 1증가하기 이전의 값이다, 변수의 참조 후에 연산을 수행

※전위연산자, 후위연산자는 오직 변수만 피연산자로 가능

상수나 일반 수식을 피연산자로 사용 불가능

int a = ++10; // 상수에는 불가능

(a+1)--; // 일반 수식 에도 불가능

 

 

6. 단항식(Unary epxression)

  • 피연산자(operand)즉 연산자에 적용되는 항이 한 개 있는 표현식(expression)

  1. 전위, 후위 증감 연산자 : ++a, --a, a++, a--

  2. sizeof

  3. 부호 연산자 : +a, -a

    • 여기서 산술연산자와 부호연산자가 같다고 생각할 있지만, 다르다, 산술연산자는 연산자가 피연산자 사이에 올때만 가능하다, 1+a, 2-a, a*b, a/b, a%b

  4. 형변환(casting) 연산자, (자료형)변수 : (float) iNum

  5. 주소 연산자(&) : &iNum

  6. 역참조 연산자 *  : *ptr_iNum;

 

7. 이항식(Binary expression)

  • 연산자가 피연산자 사이에 있음
  1. 산술연산자 : a + 7 , 3 + 4, b - 11, 5%2
  2. 논리 연산자 : !, &&, ||, &, |, <, >, <=, >=, ^

 

8. 삼항식(Ternary expression)

  • a ? B : C
  • 조건식 A 참이면 B 아니면 C

    • int result = a > 3 ? 1 : 0; // a 3보다 크면 1 result 대입, 아니면 0 result 대입

       

       

 

9. 할당수식(Assignment expression)

  • a = 7

  • 우측의 값을 좌측의 저장장소에 저장 하라는 의미
  • 할당 연산자를 기준으로 좌측은 Lvalue 라고 하고 우측을 Rvalue 라고 한다
  • Lvalue는 또다른 명칭으로 locator value이며 저장 장소를 뜻한다,
  • Rvalue는 evaluated value, value of an expression 즉 수식의 결과 값이다

 

반응형

'C' 카테고리의 다른 글

memset, memcpy, memmove  (0) 2020.03.13
Local Variable, Global Variable, Static Variable  (0) 2020.02.28
fseek, ftell, 파일 크기 알아내기  (0) 2020.02.25
FileStream Input Output  (0) 2020.02.22

+ Recent posts