zoukankan      html  css  js  c++  java
  • 3、C++ Primer 4th 笔记,基本语言相关的概念[2]

    1、数组的维数必须用大于等于1的常量表达式定义:只能包含整形字面值常量,枚举常量,或用常量表达式初始化的整形const对象。

    数组下标的类型是size_t,是cstddef中定义的与机器相关的无符号整形。

    C++不允许长度为0的数组变量,但明确指出,调用new动态创建长度为0的数组是合法的。

    2、把int型变量赋给指针是非法的,尽管此int型变量的值可能为0。但允许把数值0或在编译时可获得0值的const量赋给指针。

    void*:可以指向任何非const对象的指针类型;可以进行的操作有:用作函数形参,返回类型,与其它指针进行比较;但是不允许使用void*指针操作它所指向的对象(不能进行解引用操作)

    两个指针相减结果是标准类型ptrdiff_t的数据,是signed整形。

    3C++允许计算数组或对象的超出未端的地址,但不允许对此地址进行解引用操作;而计算数组超出未端位置之后或数组之前的地址都是不合法的。

    1)指向const对象的指针

    const double *cptr;

    由于没有办法分辩cptr所指的对象是否为const,所以系统会把它所指的所有对象都视为const

    cptr不是const。只是无论cptr指向的是const double,还是非const double,都不可以改变其值。

    2const 指针

    int *const curErr;

    curErr是指向int型对象的const指针。

    注意const在有反引用操作符*和没有反引用操作符时的区别。

    typedef string* pstring;
    const pstring cstr;
    类同:
    const int i;此时,const修饰的是i,而不是int。
    

    4strlen总是假定其参数字符串以null字符结束(因为函数在计算个数以null认为是结束符),但是计算个数不包括null结束符。

        strncat会把目标字符串的最后一个null结束符覆盖,并且在新串后写入新的结束符。

    7C++中,字符串字面值就是C风格字符串,都以null结尾。

    8、表达式由一个或多个操作数通过操作符组合而成。仅包含一个字面值常量或变量的表达式是最简单的。如果表达式中没有操作符,结果就是操作数本身。

    9、移位操作的右操作数不可以是负数,而且必须严格小于左操作数位数的值;否则,操作结果未定义。

    位的操作和使用:1UL<<27等等。

    10、赋值表达式的值是左操作数的值,其结果的类型为左操作数的类型。

    养成使用前置操作是个好习惯。(++i

    11sizeof操作符

    sizeof(type_name);
    sizeof (expr);
    sizepf expr;
    

    12C++中,规定了操作数计算顺序的操作符还有条件(?:)和逗号操作符;除此之外,其它操作符并未指定其操作数的求值顺序。

    一个表达式里,不要在两个或更多的子表达式中对同一对象做自增或自减操作。

    13、类型名后加()来对动态创建的对象初始化。

    int *pi = new int();

    14、隐式转换

        while(cin) //cin converted to bool

        如short,unsigned short等一起,如果int可以容纳该类型的所有可能值,则转换成int,否则转换成unsigned int

        表达式中的signed intsigned共存时,signed转化成signed int

        整形数值常量0可转换为任意指针类型。

    不将数组转换成指针的例外情况下:&(取地址),sizeof,用数组对数组的引用作初始化。

    15、强制类型转换[1,2-P160中文版]

    cast-name<type>(expression);

    1dynamic_cast 支持运行时类别指针或引用所指向的对象。

    2static_cast 编译器隐式执行的任何类型转换都可以由static_cast显式完成。

    3reinterpret_cast 通过为操作数的位模式提供较底层的重新编译。

    强制类型转换关闭或挂起了正常的类型检查,尽量避免使用。如:

    int *ip;

    char *pc = reinterpret_cast<char*>(ip);

    程序员必须永远记住pc所指向的是真实对象是int型,而非字符数组,任何假设pc为普通字符指针的应用,都有可能带来运行时错误。如

    string str(pc); //有怪异行为

    此外,旧式强制类型转换依赖于所涉及的数据类型,具有与上面三种显式转换一样的形为;编译器根据实际情况应用相关合适的转换。

    int ival; double dval;
    ival += int (dval); // static_cast: converts double to int
    const char* pc_str;
    string_copy((char*)pc_str); // const_cast: casts away const
    int *ip;
    char *pc = (char*)ip; // reinterpret_cast: treats int* as char*
    

    15、结合性:决定同一优先级的操作符如何结合;

    优先级:决定复合表达式中不同操作符的结合方式。

    参考

    [1] 进一步了解显式类型转换

    http://blog.163.com/zhoumhan_0351/blog/static/39954227201031695850264/

    [2] C++ Primer 4th

  • 相关阅读:
    获取移动端屏幕的宽度的方法
    document.body 与 document.documentElement区别介绍
    鼠标放上去会变化
    获取当前日期的函数
    侧边栏和右边高度的问题
    【Ajax】接收后台数据在html页面显示
    JS获取屏幕的大小
    python——字符串的方法及注释&字符串格式化符号含义及转义字符含义
    python——元组
    python——列表操作符
  • 原文地址:https://www.cnblogs.com/mydomain/p/1971515.html
Copyright © 2011-2022 走看看