22. L-Value, R-Value
L-Value : 메모리를 가진 데이타, 주소 연산을 통
해 주소를 얻어 올 수 있다.
- non-modifiable lvalue
- modifiable lvalue
R-Value : 임시 객체나 표현식(expression)
string s1 = "aaa";
string s3 = s1 + s2 + string("ccc");
function( string("aaa") );
string &s4 = "aaa"; // error
24. 연산자 우선 순위
a+b*c => a+(b*c)
*p++ => (*p)++
우측 결합성(right-associativity)
단항 연산자, 대입 연산자
a=b=c => a=(b=c)
좌측 결합성,
단항 연산자, 대입 연산자를 제외한 나머지 연산
자
a+b+c => (a+b)+c
25. 어휘 토큰으로 인정할 수 있는 가장 긴 문자열이
우선적으로 선택된다.
a+++b = (a++)+b
26. void f(int x, int y)
{
int j = x = y;
int *p = &++x;
int *q = &(x++); // error
int *pp = &(x>y? x:y);
}
27. int x = f(2) + g(3); // 함수 호출 순서는 미정의
int i = 1;
v[ i] = i++; // 실행 결과를 예측할 수 없음
단축 평가(short-cut evaluation)
&&(and) 연산은 좌변이 true일 때 우변 평가
|| (or) 연산은 좌변이 false일 때 우변 평가
28. 비트단위 논리 연산자
& : bit and
| : bit or
^ : bit xor
~ : bit not
>> : shift left
<< : shift right
32. 명시적 타입 변환
static_cast : 같은 클래스 계통 안의 포인터 타입
끼리 캐스팅
reinterpret_cast : 관련되지 않은 타입 사이 캐스
팅
(T)e 캐스팅 ex) int a = (int)b;
(T)e 캐스팅은 static_cast, reinterpret_cast,
const_cast를 모두 합친 변환함수다.
33. 생성자
T(e) 표기법
int i = int(10);
string i = string("aa");
템플릿을 작성할 때 기본 타입과 사용자 정의 타
입을 구분없이 처리 할 수 있다.
35. 문장으로서의 선언문
코드 중간에 선언문을 놓을 수 있는 것의 장점
1. const 를 사용해서 프로그램을 안전성을 높일
수 있다.
2. 초기치가 주어질 때까지 객체생성을 미룰 수
있다.
.... program....
string s = "~~~";
36. 조건식 내부에 선언문 두기
if (double d = prim())
{
~~
}
변수의 유효 범위를 가능한 작게 하는 방법
37. 주석문 및 들여쓰기
다음과 같은 주석문은 쓰지말자.
// 변수 "v"를 초기화해야 한다.
// 변수 "v"는 함수 "f()"에의해서만 초기화되어야 한다.
// 이 파일에 있는 다른 함수들보다 "init()"를 먼저 호출할 것
// 프로그램의 마지막 부분에서 "cleanup()"을 호출할 것
// 함수 "weird" 는 사용하지 말 것
// 함수 "f()"는 두 개의 인자를 받는다.
코드에 자연스럽게 녹아 있는 것들은 주석문에 또 등장할 필
요가 없다.
38. 저자가 좋아하는 주석문
1. 소스 파일 하나에 대한 주석문.
2. 각 클래스, 템플릿, 네임스페이스에 대한 주석문
3. 주요 함수에 대한 주석문. 여기에는 함수의 용도, 사용된 알고리즘, 함수의
정상 작동을 보장하는 주변 환경에 대한 가정 등이 들어간다.
4. 전역 변수 및 네임스페이스 변수 그리고 상수에 대한 주석문
5. 코드가 단순하지 않은 경우 그리고 이식성이 보장되지 않을 경우에 달아 놓
은 주석문
주석문을 잘 쓰는 것도 프로그램 잘 짜는 것만큼 어려우며,
꾸준히 연마해 두면 언젠가는 프로그래밍 능력과 함께 빛날
기술이다.
39. 바른 프로그래밍을 위한 고수의 조언
1. 비 표준의 서드 파티 라이브러리 및 직접 손으로 만든 코드 보다는 표준 라이브러리를 우선적으로
고려할 것.
2. 복잡한 표현식은 금물
3. 연산자 우선순위가 의심되면 괄호를 사용할 것.
4. 명시적 타입 변환(캐스트)을 피할 것.
5. 명시적 타입 변환을 굳이 사용해야 한다면, C스타일의 캐스트 대신에 C++전용 캐스트 연산자를 사
용할 것.
6. 결과 값이 잘 정의된 경우에만 T(e) 표기법을 사용할 것.
7. 표현식 평가 순서가 불명확해지는 경우를 피하자.
8. goto는 가급적 기피 대상.
9. do문도 마찬가지
10. 어떤 값으로 초기화되기 전엔 그 변수를 선언하지 말자.
11. 주석문은 언제나 또박 또박, 명확하게.
12. 들여쓰기는 일관성 있게 구사하자.
13. 전역 함수 버전의 operator new()를 대신하고 싶으면 멤버 버전의 operator new() 를 우선적으로
고려하자.
14. 입력을 처리할 때는 언제든 입력이 엉망으로 들어올 수 있음을 명시할 것.