zoukankan      html  css  js  c++  java
  • Chapter 5. Expressions

    算数操作符

    • eg: + - *

    逻辑操作符

    • eg: & | ! < =

    位操作符

    • Operator Function
      ~ bitwise NOT 位求反
      << left shift 左移
      >> right shift 右移
      & bitwise AND 位与
      ^ bitwise XOR 位异或
      bitwise OR 位或
    • IO操作符的优先级和结合性:移位操作符具有中等优先级,其优先级比算术操作符低,但比关系操作符、赋值操作符和条件操作符优先级高。

         cout << 42 + 10;   // ok, + has higher precedence, so the sum is printed
         cout << (10 < 42); // ok: parentheses force intended grouping; prints 1
         cout << 10 < 42;   // error: attempt to compare cout to 42!
    

    赋值操作符

    • 赋值操作符具有右结合性,赋值操作返回的是左值。ival = jval = 0,这一句中先将0赋给jval,返回值是jval,再将jval赋给ival。

    自增和自减操作符

    • 前置操作返回左值,后置操作返回右值。只有在必要的时候才使用后置操作符,因为前置操作需要做的工作更少。
    • *iter++ 后自增的优先级高于解引用,所以这句代码意义是先后自增,然后解引用,当然后自增返回的副本是未自增前的。作为c++程序员,最好熟悉并使用这种简洁又准确的方式。

    箭头操作符

    • .->,知道用就行了。

    条件操作符

    • cond ? expr1 : expr2;要注意避免深度嵌套,代码太长的话,用if可读性更强些。
    • 条件操作符的优先级相当低。

    sizeof操作符

    • 有三种语法形式。
      • sizeof (type name);
      • sizeof (expr);
      • sizeof expr;
    • sizeof 操作符的作用是返回一个对象或类型名的长度,返回值的类型为 size_t

    逗号操作符

    • 逗号表达式是一组由逗号分隔的表达式,这些表达式从左向右计算。逗号表达式的结果是其最右边表达式的值。如果最右边的操作数是左值,则逗号表达式的值也是左值。

    复合表达式的求值

    • 什么是优先级,什么是结合性?优先级是不同操作符之间先算哪个,结合性是相同优先级操作符之间先算左边还是先算右边的。
    • 大多数操作符没有规定其操作数的求值顺序:由编译器自由选择先计算左操作数还是右操作数。
    • *++iter iter先自加然后解引用。

    new和delete表达式

    • 动态创建的对象,初始化情况和静态的一样。

    类型转换

    • 隐式类型转换(编译器自动进行的)

      • 操作数两端的类型被转换成相同类型。

      • 用作条件表达式的类型被转换成bool类型。

      • 不同类型的变量和表达式之间初始化或者赋值的时候。例如int *p = 0int 0 converted to null pointer of type int*

      • 算术转换,比如整数提升,bool提升到int就是1和0。其他还有很多奇葩的转换细节,一般不会自找麻烦这么写吧

      • 指针转换。看个例子

        int a[10];
        int* p = a;// 这里是有一个array到指针的转换,我以前以为a就是指针,现在知道却是存在一个类型转换的,不然的话,&a的值就应该是
        std::cout<<a<;//所以这里也有转换
        std::cout<<&a;//取址和sizeof没有转换,或者引用也没有转换
        std::cout<<p;
        

        经过测试,这三个输出结果都是一样的。

      • 算数值和指针都可以转换为bool。

      • 枚举类型转换成int。

      • 标准库类型定义的转换,例如while (cin >> s)这里隐式使用了 IO 标准库定义的类型转换。

    • 显式转换

      • static_cast:编译器隐式执行的任何类型转换都可以由 static_cast 显式完成
      • dynamic_cast
      • const_cast:添加或删除const特性。例如const_cast<char*>(pc_str)就是可以将const类型的pc_str转换为char*
      • reinterpret_cast: 这个用的少吧,书上的解释是A reinterpret_cast generally performs a low-level reinterpretation of the bit pattern of its operands
      • 使用的格式是castname<type>(expression),castname是上面四种转换方式中的名字,type是要转换的类型。
    • 建议:避免使用强制类型转换

  • 相关阅读:
    spark简单入门
    vim 树形目录插件NERDTree
    Windows下查看系统端口使用的命令
    网络爬虫爬取动态网页
    Java并查集链表实现
    基于mahout的海量数据关联规则挖掘
    高维特征降维方法-随机映射
    JVM(4)--垃圾回收算法
    Java高并发程序设计(六)--线程池(1)
    Java高并发程序设计(五)--ReentrantLock源码解析
  • 原文地址:https://www.cnblogs.com/arctanx/p/5227934.html
Copyright © 2011-2022 走看看