C++ primer 第四章 一些知识点。

时间:2022-08-24 07:43:18

 

 

 

  1. 如果表达式指向并修改了了同一个对象,将会引发错误并且产生未定义的行为。

      例如:

int i;
cout<<i<<"  "<++i<<endl; //未定义的

  编辑器可能先 ++i 再输出i, 也可能先输出i, 再 ++i。 结果是不可控的。所以不管结果是什么都是错的。

  

  再比如表达式  f() + g() * h() +j(),如果这四个函数不会改变同一对象,也不会进行io操作,那么这句话中,先调用哪个函数无关紧要。 反之,如果影响同一对象就会产生未定义的行为,是错误的表达式。

  

 

  2. 

  bool b = true;

  bool b2 =-b;  //b2 是true     

  首先 b为true 会被转换成1, b2 = -1, -1!=0, 所以b2 也是true

 

  3.

  比较运算符

  if(i<j<k) 错误,i<j返回值是布尔值, 之后布尔值再和k进行比较

  if(i<j && j<k) //正确

  

4.应该使用++i,而不是i++, i++,会保留原始的i,如果用不到原始的i值,这会造成一种性能浪费, 所以要用++i。、

当我们又要使用原来的值,又要递增该变量,就可以使用后置运算符i+

举例:

  

auto pbeg = v.begin()
while(pbeg!=v.end() )
    cout<<*pbeg++<" ";
cout<<endl;

 4.21

 

# include<iostream>
# include<string>
# include<vector>

using namespace std;

int main()
{

    vector<int> nums;
    cout<<"please enter some whole numbers:";
    int n;
    while(cin>>n && n!='\n')
    {
        nums.push_back(n);

    }

    for(auto &t : nums)
    {
        int result = (t%2 ==1) ? 1 : 0;
        cout<<result<<endl;
        if(result == 1)
            t = 2*t;

    }

    for(auto &t : nums)
        cout<<t<<" ";

    cout<<endl;


    return 0;

}

 

4.23

string pl = s + (s[s.size() - 1] == 's' ? "" : "s") ;

 

4.24

左结合会引起矛盾,不成立。

 

4.30

(a)  (sizeof x) +y

(b)  sizeof(p->mem[i])

(c)  (sizeof a) < b

(d)  无需改变。

 

const

 

顶层host:表示指针本身是一个常量。

底层host:表示指针所指的对象是一个常量。

int i =0;

int *const p1 = &i; // 不能改变p1的值, 这是一个顶层const

const int c1 = 42;  //不能改变c1的值,这是一个顶层const

const int *p2 = *c1; //允许改变p2的值,这是一个底层const  

 

const_cast

const_cast的目的并不是为了让你去修改一个本身被定义为const的值,因为这样做的后果是无法预期的。const_cast的目的是修改一些指针/引用的权限,如果我们原本无法通过这些指针/引用修改某块内存的值,现在你可以了。

#include<iostream>

using namespace std;

int main() 
{
const int a = 12;
const int *ap = &a;  //这是一个底层const
int* tmp = const_cast<int*>(ap);
*tmp = 11;
cout<<a;
}