C++学习笔记(3)

C++ Primer Chapter 4

Expression 表达式

定义:含有一个或多个运算符并在计算后能产生结果

1
2
3
4
int a = 1;//双目运算符 +-*/=

int * b = &a;
*b = 10;//单目运算符*(解引用)

Overload Operator 重载运算符

  • 可以改变内部的操作方式
  • 不能改变优先级(eg:让+比*更优先)
  • 不能达到改变操作数,改变操作数数目的目的

左值和右值(c++11)

1
int &&rvalue = 20;
  • 左值使用的是对象的identity(location in memory),右值直接使用对象的value(内容contents);
  • 右值的使用可以避免拷贝;

Precedence & Associativity 优先级和结合性

运算符之间有优先级的不同,用括号可以改变。优先级解决的问题是,先计算哪个运算符,结合性解决的问题是,当一个操作码的左右两边都有运算符,且优先级相同时,该操作码属于哪个运算符。

不要🙅在同一个语句中既改变它的值又引用它

例如:

1
2
3
int i = 0;
//      |reference    |modification
cout << i << " " << ++i << endl;
  • 可能实际的运行顺序和我们想象的不一样
  • 可读性差

再如:

1
2
3
4
5
6
string s = "hellow world";
beg = s.begin();

while(beg != s.end() && !isspace(*beg)){
    *beg = toupper(*beg++);
}

其中*beg = toupper(*beg++)可能被编译成:

1
2
beg++;
*beg = toupper(*beg);

也有可能是

1
2
*beg = toupper(*beg);
beg++;

短路

对于 &&||,能通过左边的值判断出整个表达式的值的时候,不会再计算右边表达式的值

order of evaluation, precedence and ssociativity 评估(运算)顺序

对于:

1
int sum = f() + g()*k() - h();

计算整体式子的值,先计算g()*f(),再相加f()h(),但编译器没办法保证先计算哪个函数的值,如果这几个函数之间有依赖关系的话,容易出现错误🙅。

C++ Primer Chapter 5

Tips:

  1. 空语句可读性差
  2. 流程控制语句(if-else,while()等)中,不管写多少语句(compound statement),都用花括号括起来
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
//Null statement
int cond = 1;;;;//Null statement

//compound statement
if(cond == 1);//compound statement
cout << "cond == 1" << endl;

//mismatch
int k = 0;
if(a == 1)
    if(c == 100)
        cout << "dslkfmlk" << endl;
    else
        cout << "fali" << endl;

try-catch

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include<stdexcept>

void func(){
    throw std::invalid_argument("invalis arg")
}

int main(){
    try {
        func();
    } catch(const std::invalid_argument& e){
        cout << "err catched:" << e.what() << endl;
    }
}