您现在的位置: 万盛学电脑网 >> 程序编程 >> 网页制作 >> Html5 >> 正文

C++的表达式详解

作者:佚名    责任编辑:admin    更新时间:2022-06-22

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

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

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

4 dynamic_cast:运行时类型识别。

以上就是我们给大家介绍的C++的表达式详解,希望大家继续关注本网站。