C++Primer_学习笔记(五)

2019年4月17日

4.1什么是表达式?

表达式由一个或多个操作数构成。特别声明,一般来说表达式的结果是个右值。算术表达式的结果是个右值,算术表达式结果的类型转换由操作数的类型来决定。当存在多种数据类型时,编译器将根据一套预定义的类型转换规则集进行类型转换。

当两个或两个以上的操作符被组合起来的时候,这样的表达式被称为复合表达式(compound expression)。

在实际情况下,子表达式计算顺序常常是C或C++初学者出错的根源。一般来说,子表达式的计算顺序由操作符的优先级(precedence)和结合性(associativity)来决定。

4.2算术操作符

显示类型转换(explicit type convversion)或强制类型转换(cast).强制转换使编译器把一个对象(或表达式)从当前的类型转换成程序员指定的类型。

浮点数的算术运算还有一个精度问题:在计算机,当他表示一个数值时候,只有固定的数位可以使用,当一个数值被修改,以便适合“用来表示该数的float、double或long double类型”时,就会发生浮点舍入(roundoff).浮点数加法、乘法和减法的结果精度受到底层数据类型的固有精度的影响。

4.3等于、关系和逻辑操作符

等于、关系和逻辑操作符的计算结果是布尔常量true或false.如果这些操作符用在要求整数的上下文环境中,它们的结果将被提升为1(true)或0(false)。

4.4赋值操作符

赋值和初始化有时候会被混淆,因为他们都使用同一个操作符(=)。一个对象只能被初始化一次,也就是在它被定义的时候,但是在程序中可以被赋值多次。

    赋值的规则是右边表达式必须与左边被赋值的类型完全匹配。但是如果不匹配的时候,编译器会试着隐式地将右操作符的类型转化成被赋值对象的类型。如果这种类型转换是有可能的,则编译器会悄悄进行(如果涉及到精度损失,如double转换成int,通常会给出一个警告)。

    如果不可能进行隐式的类型转换,那么赋值操作被标记为编译时刻错误。

    赋值操作符的左操作数必须是左值,即,它必须有一个相关联的、可写的地址值。下面是一个明显的非左值赋值的例子:1024 = ival;

    4.5递增和递减操作符

    递增(++)和递减(--)操作符为对象加1或减1操作提供了方便剪短的表示,它们最一般的用法是对索引、迭代器或指集合内部的指针加1或减1。

    4.6复数操作

   

    #include<complex>

   

    complex<double> a;

    complex<double> b;

   

    complex<double> c = a*b+a/b;

    complex<double> complex_obj = a+3.14159;

    我们可以用一个算术类型的值对复数初始化或赋值,如:

    double deval = 3.14159;

    complex_obj = dval;

或  int ival = 3;

但是,相反的情形并不被自动支持,算术数据类型不能直接被一个复数类对象初始化或赋值。

double dval = complex_obj;//会导致编译错误。

此种情况可以采用显式地指明我们要用复数对象的哪部分来赋值。

如:double re = complex_obj.real();

    double im = complex_obj.image();

复数支持四种复合赋值操作符:(+=),(-=),(*=),(/=)

   

 

    4.7条件操作符

    也成为三目运算符。

    expr1 ? expr2 : expr3;

    expr1的计算结果不是true,就是false,如果为真,expr2被计算,否则expr3被计算。

注:条件操作符可以被嵌套,但是深度 的嵌套比较难读

    4.8sizeof()操作符

    sizeof()操作符的作用是返回一个对象或类型的字节长度。sizeof操作符在编译时刻计算,因此被看做是常量表达式。它可以用在任何需要常量表达式的地方。如数组的维数或模板的非类型参数。

 

    4.9new和delete表达式

    系统为每个程序提供了一个在程序执行时候可用的内存池,这个可用内存池被称为程序的空闲存储区(free store)或堆(heap)。在程序运行时刻的内存分配被称为动态内存分配(dynamic memory allocation)。动态内存分配由new表达式应用在一个类型指示符(specifier)上完成,类型指示符可用是内置类型或用户定义的类型,new表达式返回指向新分配的对象的指针。

    当对象完成了使命,我们必须显式地把对象的内存返还给空闲存储区。我们通过delete表达式应用在“指向我们用new表达式分配的对象指针”上来做到这一点(delete表达式不应该用在“不是通过new表达式分配的执政上”)。

例如:  int pi;

         detele pi;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值