`

C++表达式(From:C++Primer)

 
阅读更多

4.1 算术运算符

*     两个整数相除的结果是整数。如果商含有小数部分,将被截掉。

*     %该操作符只能被应用在整数类型(charshortintlong)当两个操作数都是正数时,结果为正。但是,如果有一个(或两个)操作数为负,余数的符号则取决于机器。因此,移植性无法保证。

*     算术异常:算术表达式的计算会导致不正确或未定义的值。例如:除零、溢出。

*     标准C++头文件limits提供了与内置类型表示有关的信息,另外C++编译系统也提供了标准C头文件climitscfloat,它们定义了提供类似处理的预处理宏。如何使用这些头文件来防止溢出和下溢,参见[PLAUGER92]的第4章和第5章。

*     浮点数的算术符还涉及精度的问题:在计算机中,当它表示一个数值时,只有固定的数位可以使用。浮点数加法、乘法和减法的结果精度受到底层数据类型的固有精度的影响。

4.2 等于、关系和逻辑操作符

*     二元关系操作符(小于或等于操作符)的缺点①:左右操作数的计算顺序在标准CC++都是未定义的,因此计算过程必须是与顺序无关的。

*     缺点②:要判断ivaljvalkval是否各不相同。if ( ival != jval != kval )是错的,需要写成如下,if ( ival != jval && ival != kval && jval != kval )

4.3 赋值操作符

*     赋值和初始化都使用=一个对象只能被初始化一次,也就是在被定义的时候,但在程序中可以被赋值多次。

*     将不同类型的表达式赋值给一个对象时,右边表达式的类型必须与左边被赋值对象的类型完全匹配。编译器会试着隐式地将右操作数的类型转换成被赋值对象的类型,如果转换是合法的,则编译器会悄悄地进行(如果会引起精度损失,通常会给出一个警告)。如果不可能进行隐式的类型转换,那么赋值操作被标记为编译时错误。

*     赋值操作符的左操作数必须是左值——必须由一个相关联的、可写的地址值

4.4 递增和递减操作符

*     使用断言#include <cassert>assert(条件表达式)

4.5 条件操作符

*     语法格式:expr1 ? expr2 : expr3

4.6 sizeof操作符

*     sizeof的作用是返回一个对象或类型名的字节长度

       三种形式:①sizeof(type_name) sizeof(object) sizeof object

*     返回类型是size_t,这是一种与机器相关的typedef的定义。在<cstddef>中定义

*     sizeof应用在数组上,返回的是数组的字节长度,而不是数组的长度

*     sizeof在编译时刻计算,因此被看做常量表达式

4.7 newdelete表达式

*     没有语法能为动态分配的数组的元素指定一个显示的初始集合,如果是类的对象数组,如果定义了缺省构造函数,那么每一个元素都会使用缺省构造函数初始化。

*     将同一个对象释放一次以上是不合法的,会在运行时产生一个未定义的行为

4.9 逗号运算符

*     从左向右计算,结果是最右边的值

4.10 位操作符

*     如果一个对象被用作一组位或位域的离散集合,称此对象为位向量(bitvector

*     位向量是用来记录一组项目或条件的是/否信息的紧缩方法

*     编译器中,类型声明的限定修饰符,如constvolatile,有时就存储在位向量中

*     iostream库用位向量表示格式状态,例如:输出的整数是以十进制、十六进制等

*     支持位向量的两种方式:

       ①使用内置整值来表示位向量,典型使用unsigned int

       ②标准库bitset类,支持位向量的类抽象

建议使用标准库的类抽象

*     用整值数据类型作为位向量时,类型可以是有符号的,也可以是无符号的,强烈建议使      用无符号类型。因为大多数的位操作中,符号位的处理是未定义的,因此在不同的实现    中符号位的处理可能会不同。在一个实现下可行的程序,在另一个实现有可能会失败。

*     按位非操作符(~):翻转操作数的每一位,每个1被设置为0,而每个0被设置为1

*     移位操作符(<<>>):将其左边操作数的位向左或向右移动某些位。操作数中移到外    面的位被丢弃。左移操作符(<<)从右边开始用0补空位。如果操作数是无符号数,则是右移操作符(>>)从左边开始插入0,否则的话,它或者插入符号位的拷贝,或者插入0,具体由实现定义。

*     按位与(&):如果两个操作数都含1,则结果是1。否则是0

*     按位异或(^):在每个位所在处,如果两个操作数只有一个含有1,则结果该位为1,否则为0

*     按位或(|):如果两个操作数有一个或者两个含有1,则结果为1,否则为0.

*     通过使用常数1移位,再进行位操作来设置或取消某个位的值。

4.11 bitset操作

*     要使用bitset类,必须包含相关的头文件。#include <bitset>

*     bitset三种声明方式:

-      缺省定义中,只需简单地指明位向量的长度。例如:bitset<32> bitvec;缺省情况,所有位都被初始化为0

-      传递一个无符号参数。例如:bitset<32> bitvec2(0xffff);

-      传递一个代表01的字符串。例如:string bitval(“1010”); bitset<32> bitvec4(bitval);

*     转换为字符串:bitvec3.to_string();

*     转换为unsigned longto_ulong();

4.12 优先级

*     优先级顺序:

       -      ::(全局域)、::(类域)、::(名字空间域)

       -      .(成员选择)

       -      ->(成员选择)

       -      [](下标)

       -      ()(函数调用)()(构造函数)

       -      ++(后置递增)

       -      --(后置递减)

       -      C++类型转换

       -      ++/--(前置递增、递减)

       -      ~/!/-/+(按位非、逻辑非、一元减、一元加)

       -      *(解引用)

       -      &(取地址)

       -      ()(类型转换)

       -      */%+-

       -      << >>

       -      比较 <<=>>===!=

       -      &^(异或)、|(按位或)、&&(逻辑与)、||(逻辑或)、

       -      ?:(条件运算符)、=(赋值)、复合赋值(*=/=

       -      throw

       -      ,(逗号运算符)

4.13 类型转换

*     C++并不是把不同类型的值加在一起,而是提供一组算术转换,以便在执行算术运算之前,将两个操作数转换成共同的类型。

*     转换规则:小类型总是被提升成大类型,以防止精度丢失。这些转换由编译器自动完成,无需程序员介入----称为隐式类型转换

*     doubleint的转换不支持舍入,需要编写程序来实现。

4.13_1 隐式类型转换

*     C++定义了一组内置类型对象之间的标准转换,在必要时它们被编译器隐式地应用到对象上。隐式类型转换发生在下列这些典型的情况:

-      在混合类型的算术表达式中。这种情况下,最宽的数据类型成为目标转换类型称为算术转换

-      用一种类型的表达式赋值给另一种类型的对象,这种情况,目标转换类型是被赋值对象的类型

-      把表达式传递给一个函数调用,表达式的类型与形式参数的类型不相同。这种情况,目标转换类型是形式参数的类型

-      从一个函数返回一个表达式,表达式的类型与返回类型不相同。这种情况下,目标转换类型是函数的返回类型

4.13_2 算术转换

*     算术转换保证了二元操作符(如加法或乘法)的两个操作数被提升为共同的类型,然后再用它表示结果的类型。

*     为了防止精度丢失,如果必要的话,类型总是被提升为较宽的类型

*     所有含有小于整型的有序类型的算术表达式。在计算之前,其类型都会转换成整型。对于比int小的整型,包括:charsigned charunsgined charshortunsgined short,如果类型的所有可能的值都能包容在int内,它们就会被提升为int型,否则它们将被提升为unsgined int

*     long类型的一般转换有一个例外:如果一个操作数是long类型,另一个是unsigned int类型,只有机器上的long类型足够长以便能够存放unsigned int的所有值时,unsigned int才会转换为long,否则两个操作数都被提升为unsigned long

4.13_3 显示转换

*     也被成为强制类型转换(cast

*     static_castdynamic_castconst_castreinterpret_cast

*     const_cast,去掉表达式的常量性(以及volatile对象的volatile性)

*     static_cast,类似于C风格的强制转换。无条件转换、静态类型转换。编译器隐式执行的任何类型转换都可以由static_cast完成。用于:

       -      基类和子类之间的转换

       -      基本数据类型转换

       -      把空指针转换成目标类型的指针

       -      把任何类型的表达式转换成void类型

       -      static_cast不能去掉constvolatile属性

*     reinterpret_cast----转换为不同类型(不安全)时候使用。例如:

       double dval = 0.123;int *pi = reinterpret_cast<int*>(&dval);

4.13_4 旧式强制类型转换

*     只有当为C语言或标准C++之前的编译器编写代码的时候用这个语法

*     两种形式:

       -      type(expr)     // C++强制转换符号

       -      (type)expr     // C强制转换符号

*     对旧式强制转换符号的支持是为了对“在标准C++之前写的程序”保持向后兼容性,以及提供与C语言兼容的符号

分享到:
评论

相关推荐

    C++Primer课后习题解答完整版.pdf

    综上所述,文件涉及的知识点包括了C++语言的基础语法、程序结构、文件命名规范、main函数的编写、表达式的使用、语句的编写、错误处理机制、标准库的应用、关键概念的理解和循环结构的使用等。通过这些知识点,可以...

    C++Primer 习题解答(第4版)--绝对完整版

    9. **C++11及后续标准的新特性**:由于本书对应的是第四版,因此会包含C++11及其后续标准(如C++14、C++17)引入的新特性,如lambda表达式、右值引用、auto关键字、强类型枚举等。 通过这份习题解答,读者不仅可以...

    c++ primer有目录pdf第五版本5th

    《C++ Primer》是有名的C++编程教材,其第五版(5th Edition)深入浅出地介绍了C++语言的基础知识以及C++11新标准的特性。这本书由Lippman、Lajoie和 Moo三位作者共同编写,是C++初学者和进阶者的重要参考书籍。 1....

    C++Primer课后习题解答(第1~16章完整答案) 清晰 完整版

    C++表达式用于计算和生成值,例如使用加法操作符“+”或乘法操作符“*”来进行数值计算。 4. 标准库:C++标准库提供了丰富的功能,例如iostream库中的std::cout和std::cin分别用于实现标准输出和输入。使用标准库中...

    C++primer中文第五版

    在C++ Primer的第五版中,作者们对C++11和C++14的新特性进行了详尽的讲解,包括自动类型推导、右值引用、lambda表达式、并发编程以及模板元编程等。这些新特性极大地增强了C++的现代性和效率,使得C++在保持高性能的...

    C++ Primer 5th 英文高清版 (带完整目录)

    C++11、C++14和C++17引入了许多新的语言特性,如lambda表达式、右值引用、auto关键字、移动语义、并发编程支持等。《C++ Primer 5th》对这些新特性做了详细解释,让读者能够紧跟C++的发展步伐。 总的来说,《C++ ...

    C++Primer(第4版)-课后习题答案.pdf

    《C++ Primer(第4版)》是一本深入学习C++编程语言的经典教材,其课后习题答案提供了丰富的实践练习和问题解析,帮助读者巩固并深化对C++语法、概念的理解。以下将针对各章节的主要知识点进行详细阐述: 1. 第一章...

    c++ primer 第5版 英文版 原版精美排版 mobi格式 kindle直读

    第五版会介绍C++11及后续版本的新特性,如auto关键字、lambda表达式、右值引用、move语义等,这些都是现代C++编程的重要组成部分。 11. **实践项目** 书中的练习和示例代码可以帮助读者巩固所学知识,并鼓励他们...

    C++ Primer(第5版)_带书签_高清完整版

    8. **C++11新特性**:第五版涵盖了C++11标准引入的新特性和改进,如auto关键字简化类型推断、lambda表达式增强函数对象、右值引用和移动语义提升效率、nullptr替代NULL等。 9. **实践应用**:书中的例子和习题都...

    C++ Primer(Fifth Edition)(英文版+中文版)

    最后,第五版还涉及了C++11和C++14的新特性,如lambda表达式、右值引用、auto关键字、强类型枚举(enum class)、统一初始化等,这些现代C++特性极大地提升了代码的简洁性和可读性。 总之,《C++ Primer (Fifth ...

    C++ Primer第四版【中文高清扫描版】.pdf

    《C++ Primer 第四版》是著名的C++编程语言教程,由Stanley B. Lippman、Josée Lajoie和Barbara E. Moo三位作者共同撰写。该书自出版以来,已成为广大程序员学习C++的必备书籍。第四版对前三版的内容进行了彻底的...

    c++primer第五版习题答案(第17章)

    《C++ Primer》第五版是C++领域一本非常权威的教材,由Stanley B. Lippman、Josée Lajoie和Barbara E. Moo编著。该书是按照C++11标准编写的,它涵盖了C++语言的核心特性,包括数据类型、运算符、控制结构、函数、类...

    C++ primer 5e 课后答案

    11. **C++11新特性**:包括右值引用、lambda表达式、auto关键字、范围for循环、智能指针等,这些新特性极大地提高了C++的现代性和便利性。 通过解决《C++ Primer 5th Edition》的课后习题,你可以逐步掌握以上知识...

    C++ Primer Plus 第6版 中文版课后代码习题答案

    12. **C++11及以后的新特性**:第6版可能涵盖了C++11标准及以后的更新,比如右值引用、lambda表达式、auto关键字、范围for循环等。 在学习过程中,课后习题是检验理解和应用所学知识的有效途径。通过解答《C++ ...

    C++ Primer Plus 6th 2011(New C++11 Coverage)

    根据提供的文件信息,我们可以从《C++ Primer Plus 第六版》这本书中提炼出与C++相关的知识点,并结合书本描述及部分展示内容进行详细的解读。 ### 标题:C++ Primer Plus 6th 2011 (New C++11 Coverage) 此书标题...

    C++Primer第五版 第4章 表达式(练习解答)

    在C++编程语言中,表达式是程序的基本组成部分,它们用于计算值或执行操作。...通过不断实践和阅读高质量的学习资料,如《C++ Primer》,开发者可以逐步精通C++的表达式系统,从而写出更复杂、更健壮的程序。

    c++primer第五版习题答案(第18章)

    尤其值得注意的是,《C++ Primer》第五版中包含了C++11和C++14标准的内容,这两个新标准为C++语言增加了许多新特性和改进,比如auto类型推导、基于范围的for循环、智能指针、lambda表达式、移动语义、统一初始化、...

    C++ primer完整答案

    8. **C++11和C++14新特性**:这部分可能包括lambda表达式、右值引用、auto关键字、nullptr、类型推断( decltype)、并发编程支持等,这些新特性使得C++更加现代化和高效。 通过《C++ Primer第四版习题解答(完整版...

    C++ Primer全资料

    8. **C++11及后续标准**:自C++11开始,C++引入了许多新特性,如右值引用、lambda表达式、自动类型推断(auto)、范围for循环、并发编程支持等,这些都是现代C++开发的重要组成部分。 9. **实践项目**:通过实践...

Global site tag (gtag.js) - Google Analytics