当前位置:天才代写 > tutorial > C语言/C++ 教程 > C++的表达式与语句

C++的表达式与语句

2017-11-02 08:00 星期四 所属: C语言/C++ 教程 浏览:53

表达式

1,应该把函数挪用看成是一种运算符,这种运算符对参加运算的工具没有数量限制。

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

更详细的左值与右值的举例:C++ priemr 5ed P121

3,运算符的优先级划定了运算工具的组合方法,可是没有说明运算工具凭据什么顺序求值,在大大都的环境下,不会明晰求值的顺序,好比对付下面的表达式:

int i= f1() + f2();

先挪用f1照旧先挪用f2是未知的。因此,对付这种运算符来说制止多个运算工具配合修改同一个变量,如下面的代码中,最终输出是未能确定的:

int i=0;

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的运算功效是编译时的常量,留意下面的代码的值:

1 int a[10];

2 int* p = a;

3 int n1 = sizeof(a) / sizeof(*a); // n1=10

4 int n2 = sizeof(p) / sizeof(*p); // n2=1

sizeof运算符小贴士:

1 对char可能范例为char的表达式执行sizeof运算,功效为1。

2 对引用范例执行sizeof运算获得被引用工具年占空间的巨细。

3 对指针执行sizeof运算获得指针自己所占空间的巨细。

4 对解引用指针执行sizeof运算获得的指针指向的工具所占空间的巨细,指针不需要有效。

5 对数组执行sizeof运算获得的整个数组所占空间的巨细,等价于对数组中所有的元素各执行一次sizeof运算并将所得功效求和。留意sizeof运算不会把数组转换成指针来处理惩罚。

6 对sting工具或vector工具执行sizeof运算只返回该范例牢靠部门的巨细,不管帐算工具中的元素占用了几多空间。

9,在复合表达式求值时,要出格留意运算符的优先级与团结性。出格地,!=与==的优先级小于<=,>=等干系运算符。

10,范例转换

1)隐式转换

下面环境下,编译器会自动地转换运算工具的范例:

1 在大大都表达式中,比int范例小的整数值首先晋升为较大的整数范例。

2 在条件中,非布尔值转换成布尔范例。

3 初始化进程中,初始值转换成变量的范例;在赋值语句中,右侧运算工具转换成左侧运算工具的范例。

4 假如算术运算或干系运算的运算工具有多种范例,需要转换成同一种范例。

5 函数挪用时,实参加形参之间的范例转换。

6 类范例可以界说一些转换函数。

2)显式转换

1 statci_cast<Type>:任何具有明晰界说的范例转换,只要不包括底层const

2 const_cast<Type>:只能改变运算工具底层const

3 reinterpret_cast<Type>:凡是为运算工具的位模式提供较底条理上的从头表明。

4 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新引入的内容,这种语句可以遍历容器或其他序列的所有元素。它的语法形式为:

1 for(declaration:expression)

2   statement;

#p#分页标题#e#

个中expression暗示的必需是一个序列,好比用花括号括起来的初始值列表可能vector或string等范例工具。这些范例的配合特点是拥有能返回迭代器的begin和end成员。

declaration界说一个变量,序列中的每个元素都得能转换成该变量的范例。确保范例相容最简朴的步伐是利用auto范例说明符,这个要害字可以令编译器辅佐我们指定符合的范例。假如需要对序列中的元素执行写操纵,轮回变量必需声明成引用范例。

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

1 vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

2 for (auto &r : v)

3 {

4     r *= 2;

5 }

在利用范畴for时语句时,不能通过范畴for语句增加vector工具的元素。因为在范畴for语句中,预存了end()的值。一旦在序列中添加(删除)元素,end函数的值就大概变得无效了。

作者:☆Ronny丶

出处:http://www.cnblogs.com/ronny/

 

    关键字:


天才代写-代写联系方式