第4章 表达式

4.1 基础

左值和右值

当一个对象被用作左值的时候,使用的是对象的内存空间。当一个对象被用作右值的使用,使用的是对象的内存数值。

左值的同时,也可以当做右值,从而使用其值。但是右值,不一定能作为左值。

warming

赋值运算需要一个左值作为左侧运算对象,同时,也将返回一个左值。

decltype作用于左值,将返回一个引用类型,比如*p,返回的是左值,decltype(*p)得到是int&类型。decltype作用于右值,将返回一个指针类型,比如&p,返回的是右值,decltype(&p)得到是int**类型。

4.2 算术运算符(+ - * / %)

算术运算符按照从左向右的顺序进行组合,是左结合律。

算术运算符的求职结果是右值。

算术运算中,非数值需要转换成数值才能参与运算,例如bool值将分别转换为0、1.

对于%运算符,作用对象应为整数,并满足m=(m/n)*n+m%n。可知,m%n符号与m相同。

4.3 逻辑和关系运算符(>=<、==、!=、!、&&、||)

逻辑和关系运算符返回的类型都是布尔类型,运算对象和求值结果都是右值。

4.4 赋值运算符(=)

赋值运算符的左侧对象必须是一个可修改的左值。

赋值运算符返回的是他的左侧运算对象,并且是一个左值。

赋值运算符满足右结合律。

赋值运算符运算结果的用处:

int i;
while( (i=get_value()) != 42)
    do_something();

4.5 递增递减(++、--)

前置,将运算对象递增/减,并返回运算之后的对象,作为左值。后置,将运算对象递增/减,并返回运算之前对象的副本,作为右值。

因此,如非必要,避免使用后置对象,可以减少产生副本的开销。

后置的用法:

auto pbeg = v.begin();
while(pbeg != v.end() )
    //++优先级高,此处将当前值输出,并将迭代器提升一个位置
    cout<< *pbeg++<<endl;

4.6 成员访问运算符(->、.)

ptr->men等价于(*ptr).mem

4.7 条件运算符(cond ? expr1 : expr2)

条件运算符使用右结合律,是从右向左组合的。右边的通常是左边的分支。

4.8 位运算

~    按位求反
<<、>>    移位运算(有时事IO运算)
&, |    按位与、或
^    按位异或

移位运算满足左结合律。优先级比关系运算、赋值运算、条件运算高,比算术运算低。

4.9 sizeof运算符

返回表达式或者类型名字占用的字节数。满足右结合律,所得为size_t类型的常量。有两种形式:

sizeof(type)
sizeof expr

sizeof并不直接计算表达式的值。

sizeof *p满足右结合律,sizeof和*的优先级相同,因此等价于sizeof(*p)。由于不直接计算表达式的值,所以即使p是一个空指针,仍然可以求值。

warming

sizeof对char表达式运算结果为1。

sizeof对数组运算结果为整个数组占用的字节数。

sizeof对string和vector只会返回类型固定部分的大小,不返回其所有元素占用空间的大小

4.10 逗号运算符(,)

从左向右求值,返回右侧的值。

4.11 类型转换

隐式转换

比int类型小的整型,提升为较大的整型。
条件中,非布尔值转换成布尔值。初始化中,初始值转换为变量的类型;赋值中,右侧类型转换成左侧类型。
算术运算、关系运算中,转换成同一种类型进行运算。字节相同,带符号的转换成无符号的。字节不同,转换成字节多的类型。
函数调用时。

数组转换成指针。

显示转换

强制类型转换的形式:cast-name<type>(expression)

补充:const int *const p = &value,其中第二个const是顶层,限制p的内存不能更改;第一个const是底层,限制指向的内存不能改。

static_cast:只要不包含底层const,都可以使用。

const_cast:只能改变底层const性质,不能改变类型,也就是可以将常量转换为变量。

reinterpret_cast:提供对内存位模式的重新解释,例如将指向int的指针(int *ip),转换成指向char的指针(reinterpret_cast<char*>(ip) )。

int x(0x00484848);  //十六进制48,表示H
int *p=&x;
char *c=reinterpret_cast<char*>(p);
cout<< c <<endl;        //输出为:HHH,依赖于机器,此处int的高位是内存中较高的地址。

dynamic_cast:运行时类型识别。

旧式强制类型转换

type(expr)

(type)expr

时间: 2024-10-14 12:09:36

第4章 表达式的相关文章

C++ Primer学习总结 第4章 表达式

 第4章 表达式 1.    decltype作用于左值对象时,返回的是该对象的引用类型. 作用于右值对象时,返回的是该对象的类型. 2.    求值顺序. C++中只有&& || ?: 和, 4种运算符是先左后右求值的. 3.    一元正负号运算符作用于数值: 会提升当前数值的类型,比如short变成int型   4.    m%(-n) 与 (-m)%n 与 (-m)%(-n) 的结果分别是: 注意: 模的正负号没有任何影响, m的正负号决定结果的正负.   5.     关系运算符

《C++primer》v5 第4章 表达式 读书笔记 习题答案

4.1 105 4.2 *vec.begin()=*(vec.begin())//先调用点运算符,再解引用 *vec.begin()+1=(*vec.begin())+1//先解引用,再加一 4.3略? 4.4 (12/3*4)+(5*15)+(24%4/2)=91 4.5 (a)-86(b)-16 (c)0 (d)0 4.6 n%2 4.7 溢出:计算结果超出该数据类型所能表示的范围 2147483647+1 1U-2 ... 4.8 比较低.. 4.9 首先判断cp是否为空指针,若非空指针则

JavaScript权威指南第04章 表达式和运算符

www.qdmm.com/BookReader/1845423,31051137.aspx www.qdmm.com/BookReader/1845423,31073665.aspx www.qdmm.com/BookReader/1845423,31088923.aspx www.qdmm.com/BookReader/1845423,31104070.aspx www.qdmm.com/BookReader/1845423,31114804.aspx www.qdmm.com/BookRea

《C++ Primer 4th》读书笔记 第5章-表达式

原创文章,转载请注明出处: http://www.cnblogs.com/DayByDay/p/3912114.html <C++ Primer 4th>读书笔记 第5章-表达式

第三章 表达式 Lua程序设计笔记

--第三章 表达式--3.1 算数操作符--3.2 关系操作符其计算结果是true或false.如果两个值的类型不同,则Lua认为他们不相等.nil只与自身相等.对于table.userdata和函数,Lua作引用比较,只有当它们引用同一个对象时,才认为它们相等. --3.3逻辑操作符--3.4字符串连接Lua中字符串是不可变的值,连接操作符只会创建一个新字符串,而不会对员操作数进行修改.--3.5优先级Lua二元操作符中只有^ 和..是右结合,其他都是左结合 --3.6table构造式{} 混

C++primer第五章 表达式

表达式由一个或多个操作数通过操作符组合而成.最简单的表达式仅包含一个字面值常量或变量.较复杂的表达式则由操作符以及一个或多个操作数构成. 每个表达式都会产生一个结果. 5.1. 算术操作符 表 5.1 按优先级来对操作符进行分组——一元操作符优先级最高,其次是乘.除操作,接着是二元的加.减法操作. 算术操作符 +.-.* 和 / 具有直观的含义:加法.减法.乘法和除法.对两个整数做除法,结果仍为整数,如果它的商包含小数部分,则小数部分会被截除: int ival1 = 21/6; // inte

第三章 表达式

1 操作符 表达式由操作数和操作符组成 2 算术表达式 + - * / % 3 自增和自减表达式 ++ -- 4 位运算表达式 对数据按二进制位进行运算 &与.|或.^异或 `取补 <<左移 >>右移 5 赋值表达式 = += -= *= /= %= &= |= ^= <<= >>= 6 关系表达式 == != < > <= >= is 7 条件逻辑表达式 && || ! 8 其它特殊表达式 8.1 一

第六章 表达式

前面使用的{{ }}符号将一个变量绑定到$scope上的本质就是一个表达式. 表达式和eval()很相似,但有以下不同特性: 所有表达式都在其所属作用域内部执行,并有访问本地$scope的权限 不会抛出异常 不允许有流程控制功能(if/else) 可以接受过滤器和过滤器链 解析AngularJS表达式 尽管AngularJS会自动解析表达式,但有时也可以手动解析.AngularJS通过$pars这个内部服务来进行表达式运算.代码如下: <!doctype html> <html>

第4章 表达式和运算符

表达式(expression)是JS中的一个短语,JS解释器会将其计算(evaluate)出一个结果 4.1 原始表达式 4.2 对象和数组的初始化表达式 4.3 函数定义表达式 4.4 属性访问表达式 4.5 调用表达式 4.6 对象创建表达式 4.7 运算符概述 4.8 算术表达式 4.9 关系表达式 4.10 逻辑表达式 4.11 赋值表达式 4.12 表达式计算 4.13 其他运算符

The C++ Programming Language 学习笔记 第6章 表达式和语句

1.关于strcpy函数. 书中说c风格的字符串尽量少用,strcpy这样的函数应该也要少用.这里讲这个函数主要是要通过本章课后练习第十题来讲一下前面提及的要点.巩固一下前几章的知识.写了一段,本来感觉自己写得不错了,结果和网上的一笔感觉还是差很多,也学到了很多,下面贴上网址供大家看看.http://blog.csdn.net/cazicaquw/article/details/7044602. 里面讲得很详细,很多细节对于我们初学者来说也是很有用的.但感觉他写得太繁琐了,其实从指针到bool的