C++的表达式与语句

表达式

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++。因为++的优先级高于解除引用操作符。

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/

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;

其中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/

时间: 2024-08-27 06:23:37

C++的表达式与语句的相关文章

《Java语言导学(原书第6版)》一3.3 表达式、语句和块

3.3 表达式.语句和块 掌握变量和运算符后,我们学习表达式.语句和块(代码块)等要素.运算符用于构建表达式,进行运算.表达式是语句的核心组件,语句归在一起形成块. 3.3.1 表达式 表达式是由变量.运算符和方法调用(根据语法构建)等组成的构造,且表达式的计算结果为单个值.下面例子中黑体部分为表达式: 表达式的返回值类型取决于表达式中的元素.表达式cadence=0返回值的类型为int.因为赋值运算符返回值的数据类型与左边运算对象的数据类型一样,在这个例子中,cadence的数据类型为int.

《Java语言导学(原书第6版)》一一3.3 表达式、语句和块

3.3 表达式.语句和块 掌握变量和运算符后,我们学习表达式.语句和块(代码块)等要素.运算符用于构建表达式,进行运算.表达式是语句的核心组件,语句归在一起形成块.3.3.1 表达式 表达式是由变量.运算符和方法调用(根据语法构建)等组成的构造,且表达式的计算结果为单个值.下面例子中黑体部分为表达式: 表达式的返回值类型取决于表达式中的元素.表达式cadence=0返回值的类型为int.因为赋值运算符返回值的数据类型与左边运算对象的数据类型一样,在这个例子中,cadence的数据类型为int.如

JavaScript学习笔记整理_关于表达式和语句_基础知识

表达式和语句 eval( ) 只有一个参数 参数非字符串时,直接返回这个参数: 参数为字符串时,它把字符串当成JavaScript代码进行编译,编译失败则抛出语法错误,编译成功则执行代码,并返回最后一条语句的值,若没有值则返回undefined eval()使用了调用它的变量的作用域环境 它接收的字符串参数,在作为单独的代码时,必须是有语义的,否则编译失败 delete运算符:用来删除对象的自由属性.数组的元素, 删除属性后,属性将不存在,而删除数组元素后,会在数组内留下一个值为undefine

JavaScript中:表达式和语句的区别[译]_javascript技巧

1.语句和表达式 JavaScript中的表达式和语句是有区别的.一个表达式会产生一个值,它可以放在任何需要一个值的地方,比如,作为一个函数调用的参数.下面的每行代码都是一个表达式: myvar3 + xmyfunc("a", "b")语句可以理解成一个行为.循环语句和if语句就是典型的语句.一个程序是由一系列语句组成的.JavaScript中某些需要语句的地方,你可以使用一个表达式来代替.这样的语句称之为表达式语句.但反过来不可以:你不能在一个需要表达式的地方放一

《像计算机科学家一样思考Python(第2版)》——第2章 变量、表达式和语句 2.1 赋值语句

第2章 变量.表达式和语句 编程语言最强大的特性之一是操纵变量的能力.变量是指向一个值的名称. 2.1 赋值语句 赋值语句可以建立新的变量,并给它们赋值: >>> message = 'And now for somthing completely different' >>> n = 17 >>> pi = 3.1415926535897932 这个例子有3个赋值.第一个将一个字符串赋给叫作message的变量:第二个将17赋值给n:第三个将π的(近

《像计算机科学家一样思考Python(第2版)》——2.3 表达式和语句

2.3 表达式和语句 表达式是值.变量和操作符的组合.单独一个值也被看作一个表达式,单独的变量也是如此.所以下面都是合法的表达式: >>> 42 42 >>> n 17 >>> n + 25 42 当你在提示符之后键入一个表达式时,解释器会对其进行求值,即尝试找到该表达式的最终值.在本例中,变量n的值是17,而表达式n + 25的值是42. 语句是一段会产生效果的代码单元,如创建新变量或者显示一个值. >>> n = 17 >&

Lua教程(三):表达式和语句_Lua

一.表达式:     1. 算术操作符:     Lua支持常规算术操作符有:二元的"+"."-"."*"."/"."^"(指数)."%"(取模),一元的"-"(负号).所有这些操作符都可用于实数.然而需要特别说明的是取模操作符(%),Lua中对该操作符的定义为:   复制代码 代码如下:     a % b == a - floor(a / b) * b      

高质量C++/C编程指南-第4章-表达式和基本语句

读者可能怀疑:连if.for.while.goto.switch这样简单的东西也要探讨编程风格,是不是小题大做? 我真的发觉很多程序员用隐含错误的方式写表达式和基本语句,我自己也犯过类似的错误. 表达式和语句都属于C++/C的短语结构语法.它们看似简单,但使用时隐患比较多. 本章归纳了正确使用表达式和语句的一些规则与建议. 4.1 运算符的优先级 C++/C语言的运算符有数十个,运算符的优先级与结合律如表4-1所示.注意一元运算符 + - * 的优先级高于对应的二元运算符. 优先级 运算符 结合

for 语句

语句   只要指定条件为 true 都执行语句块. for (initialization; test; increment)   statements 参数 initialization 必选项.一个 表达式.该表达式只在执行循环前被执行一次. test 必选项.一个 Boolean 表达式.如果 test 是 true,则 statement 被执行.如果 test 是 false,则循环结束. increment 必选项.一个表达式.在每次经过循环的最后执行该递增表达式. statemen