表达式

1,应该把函数调用当作是一种运算符,这种运算符对参与运算的对象没有数量限制。

2,关于“左值(lvalue)”和“右值(rvalue)”可以做一个简单的归纳:当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。

更具体的左值与右值的举例:C++ priemr 5ed P121

3,运算符的优先级规定了运算对象的组合方式,但是没有说明运算对象按照什么顺序求值,在大多数的情况下,不会明确求值的顺序,比如对于下面的表达式:

int i= f1() + f2();

先调用f1还是先调用f2是未知的。因此,对于这种运算符来说避免多个运算对象共同修改同一个变量,如下面的代码中,最终输出是未能确定的:

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

但C++中有4种运算符是明确规定了运算对象的求值顺序的:逻辑与“&&”、逻辑或"||"、条件(?:)运算符、逗号运算符","。这也是为什么在我们自己定义的类类型中,一般不会去重载这几种操作符。

4,短路求值:逻辑与运算符和逻辑或运算符都是先求左侧运算对象的值再求右侧运算对象的值,当且仅当左侧运算对象无法确定表达式的结果时才会计算右侧运算对象的值。

5,区别i++与++i

后置操作符需要先保存原来的值,再将i+1,然后返回原来的值的副本;而前置操作符,只需要在原来值上加1,然后返回。所以++i比i++效率更高,当然如果i为int类型或指针时,编译器会对i++进行优化,但如果是其他类类型或复杂类的迭代器时就不会了。

6,注意解除引用操作符与++操作符的优先级,在实际代码中为了简洁经常将*(i++)写为*i++。因为++的优先级高于解除引用操作符。

7,在使用条件操作符时,尽量避免写出深度嵌套的条件操作符。另外条件操作符的优先级非常低,在表示式中使用时要注意加括号,比如:cout<<(i<j?i:j);

8,关于sizeof运算符。sizeof的运算结果是编译时的常量,注意下面的代码的值:

 int a[];
int* p = a;
int n1 = sizeof(a) / sizeof(*a); // n1=10
int n2 = sizeof(p) / sizeof(*p); // n2=1

sizeof运算符小贴士:

 对char或者类型为char的表达式执行sizeof运算,结果为1。
对引用类型执行sizeof运算得到被引用对象年占空间的大小。
对指针执行sizeof运算得到指针本身所占空间的大小。
对解引用指针执行sizeof运算得到的指针指向的对象所占空间的大小,指针不需要有效。
对数组执行sizeof运算得到的整个数组所占空间的大小,等价于对数组中所有的元素各执行一次sizeof运算并将所得结果求和。注意sizeof运算不会把数组转换成指针来处理。
对sting对象或vector对象执行sizeof运算只返回该类型固定部分的大小,不会计算对象中的元素占用了多少空间。

9,在复合表达式求值时,要特别注意运算符的优先级与结合性。特别地,!=与==的优先级小于<=,>=等关系运算符。

10,类型转换

1)隐式转换

下面情况下,编译器会自动地转换运算对象的类型:

 在大多数表达式中,比int类型小的整数值首先提升为较大的整数类型。
在条件中,非布尔值转换成布尔类型。
初始化过程中,初始值转换成变量的类型;在赋值语句中,右侧运算对象转换成左侧运算对象的类型。
如果算术运算或关系运算的运算对象有多种类型,需要转换成同一种类型。
函数调用时,实参与形参之间的类型转换。
类类型可以定义一些转换函数。

2)显式转换

 statci_cast<Type>:任何具有明确定义的类型转换,只要不包含底层const
const_cast<Type>:只能改变运算对象底层const
reinterpret_cast<Type>:通常为运算对象的位模式提供较底层次上的重新解释。
dynamic_cast<Type>:运行时类型识别。

语句

1,和大多数语言一样,C++提供了条件执行语句、重复执行相同代码的循环语句和用于中断前前控制流的跳转语句。

2,在使用块状语句时注意,在块状语句内定义的变量作用域只在块状区域内。特别地,在控制语句,比如if或for语句中,初始化或定义的变量,都只有块区域的作用域。

3,switch语句的使用。case标号必须是整形常量表达式,不允许在switch语句内定义变量如果在它下面还有case或default语句,因为这样会在某些情况下,在没有执行变量定义的case分支的情况下,执行变量定义下面case分支。除非把变量定义在代码块内。

4,在for循环中,如果有continue语句,会跳下continue后面的语句,但是不会跳变for语句中的计数器变化语句。

5,范围for语句

范围for语句是C++11新引入的内容,这种语句可以遍历容器或其他序列的所有元素。它的语法形式为:

 for(declaration:expression)
  statement;

其中expression表示的必须是一个序列,比如用花括号括起来的初始值列表或者vector或string等类型对象。这些类型的共同特点是拥有能返回迭代器的begin和end成员。

declaration定义一个变量,序列中的每个元素都得能转换成该变量的类型。确保类型相容最简单的办法是使用auto类型说明符,这个关键字可以令编译器帮助我们指定合适的类型。如果需要对序列中的元素执行写操作,循环变量必须声明成引用类型。

下面是用范围for语句来遍历一个vector的例子。

 vector<int> v = { , , , , , , , , ,  };
for (auto &r : v)
{
r *= ;
}

在使用范围for时语句时,不能通过范围for语句增加vector对象的元素。因为在范围for语句中,预存了end()的值。一旦在序列中添加(删除)元素,end函数的值就可能变得无效了。

C++的那些事:表达式与语句的更多相关文章

  1. js 表达式与语句

    引子:表达式和语句很基础,但是有时会犯错,比如: function(){}//报错 (function(){})//不报错 function f(x){ return x + 1 }()//报错 fu ...

  2. js表达式和语句趣味题讲解与技术分享

    技术分享 问题1 { a: 1 } + 1 // ? ({ a: 1 }) + 1 // ? 1 + { a: 1 } // ? 答案 { a: 1 } + 1 // 1 ({ a: 1 }) + 1 ...

  3. 【.net 深呼吸】细说CodeDom(2):表达式、语句

    在上一篇文章中,老周厚着脸皮给大伙介绍了代码文档的基本结构,以及一些代码对象与CodeDom类型的对应关系. 在评论中老周看到有朋友提到了 Emit,那老周就顺便提一下.严格上说,Emit并不是针对代 ...

  4. C Primer Plus_第5章_运算符、表达式和语句_编程练习

    Practice 1. 输入分钟输出对应的小时和分钟. #include #define MIN_PER_H 60 int main(void) { int mins, hours, minutes; ...

  5. JavaScript学习笔记-表达式和语句

    表达式和语句 eval( ) 只有一个参数 参数非字符串时,直接返回这个参数: 参数为字符串时,它把字符串当成JavaScript代码进行编译,编译失败则抛出语法错误,编译成功则执行代码,并返回最后一 ...

  6. 小猪猪C++笔记基础篇(五)表达式、语句

    小猪猪C++笔记基础篇(五) 关键词:表达式.语句 本章的内容比较简单,基本上没有什么理解上的困难,都是知识上的问题.先开始想要不要写呢,本来是不准备写的,但是既然读了书就要做笔记,还是写一写,毕竟还 ...

  7. C--运算符,表达式和语句实例

    //第五章 运算符,表达式和语句 #include<stdio.h> //引入头文件 #include<math.h> #define ADJUST 7.64 //定义常量 # ...

  8. C#表达式和语句

    表达式由操作数 (operand) 和运算符 (operator) 构成.表达式的运算符指示对操作数适用什么样的运算.运算符的示例包括+.-.*./ 和 new.操作数的示例包括文本.字段.局部变量和 ...

  9. C# - 表达式与语句

    表达式与语句(Expression&Statement) 操作数(Operands) 1.数字.2.字符.3.变量.4.类型.5.对象.6.方法 操作符(Operator) 参考:C# - 操 ...

  10. C语言之运算符、表达式和语句

    #include<stdio.h> #define ADJUST 7.31 int main(void) { const double SCALE = 0.333; double shoe ...

随机推荐

  1. H2Database数据类型

    数据类型   整数(INT) 布尔型(BOOLEAN) 微整数(TINYINT) 小整数(SMALLINT) 大整数(BIGINT) 标识符(IDENTITY) 货币数(DECIMAL) 双精度实数( ...

  2. Source Insight 基本使用(1)-使用Source Insight查看Android Framework 源码

    一.下载framework源码: google已经把framework源码托管在了gitHub上: https://github.com/android/platform_frameworks_bas ...

  3. 八大常见内排序java实现

    虽然排序算法烂大街了,但是哥依然用java实现了一遍,只为自己练练手,后面可以时不时的回头看看...仅此而已,各位可以提意见,莫喷!! 一.冒泡排序 基本思想:在要排序的一组数中,对当前还未排好序的范 ...

  4. 浅谈setTimeout函数和setInterval函数

    前几天学了js,看到了两个非常有趣的函数,他们分别是setTimeout函数和setInterval函数,这两个函数能使网页呈现非常一些网页中比较常见的效果,比如说图片轮播,等一些非常好玩的效果.下面 ...

  5. ReactiveCocoa入门教程:第一部分

    http://www.cocoachina.com/ios/20150123/10994.html 本文翻译自RayWenderlich,原文:ReactiveCocoa Tutorial--The ...

  6. Hibernate执行原生SQL返回List<Map>类型结果集

    我是学java出身的,web是我主要一块: 在做项目的时候最让人别扭的就是hibernate查询大都是查询出List<T>(T指代对应实体类)类型 如果这时候我用的联合查询,那么返回都就是 ...

  7. mongo链接报错:couldn't connect to server 127.0.0.1:27017 (127.0.0.1)

    angela@angeladeMacBook-Air:/data/db$mongo MongoDB shell version: 2.6.1 connecting to: test 2014-06-0 ...

  8. Resources in Visual Tracking(转载)

    这位博主总结了比较新的tracking方面的资源:http://blog.csdn.net/minstyrain/article/details/38640541 http://xilinx.eetr ...

  9. 【SpringMVC】SpringMVC系列12之数据类型转换、格式化、校验

      12.数据类型转换.格式化.校验 12.1.数据绑定流程     Spring MVC 主框架将 ServletRequest 对象及目标方法的入参实例传递给 WebDataBinderFacto ...

  10. 《ASP.NET MVC4 WEB编程》学习笔记------Entity Framework的Database First、Model First和Code Only三种开发模式

    作者:张博出处:http://yilin.cnblogs.com Entity Framework支持Database First.Model First和Code Only三种开发模式,各模式的开发 ...