`

C/C++ 回顾总结之隐式类型转换

阅读更多

隐式类型转换

隐式类型转换是指由编译器程序按照某种预定的规则进行自动转换。对于不同的操作,隐式转换规则会有所不同。下面针对不同种类的操作符分别介绍它们的隐式转换规则。

(1)       算术操作的类型转换

1)         如果其中一个操作数类型为long double,则另一个操作数也转换成long double

2)         如果其中一个操作数类型为double,则另一个操作数也转换成double

3)         如果其中一个操作数为float,则另一个数转换成float类型。

4)         先对操作数进行整型提升转换,如果操作数的类型不一样,则按5)以后的规则再进行转换。整形提升转换规则是:

                         i.              对于charsigned charunsigned charshort intunsigned short int类型,如果int型能够表示它们的值,则这些类型转成int,否则这些类型转换成unsigned int

                       ii.              Bool类型转换成int型,false0true1.

                      iii.              wchar_t和枚举类型转换成下列类型中第一个能表示其所有值的类型:intunsigned intlong intunsigned long int

5)         如果其中一个操作数类型为unsigned long int,则另一个操作数转换成unsigned long int 类型。

6)         如果一个操作数为long int,另一个操作数类型为unsigned int,那么如果long int能表示unsigned int的所有值,则unsigned int转换成long int,否则两个操作数都转化成unsigned long int类型。

7)         如果一个操作数为long int,则另一个操作数转换成long int类型。

8)         如果一个操作数类型为unsigned int,则另一个操作数转换成unsigned int类型。

(在上述的转换规则中,如果8)仍不满足,则根据4)的整形提升规则可知,两个操作数都已是int型了)

同时需要注意的是,把位数少的有符号整型转换成位数多的有符号整型是,需要在高位扩充符号位。另外把有符号整型转换成相应的(位数相同的)无符号整型时,不会改变有符号数据的值,只是把它在内存中的二进制位按照无符号整数来解释,这时可能会导致错误。

(2)       关系操作的类型转换

对于关系操作符,当操作数是算术类型和枚举类型时,编译程序将按常量算术转换规则对它们进行转换。

(3)       逻辑操作的类型转换

对于逻辑操作符,C++允许对算术类型、枚举类型和指针类型数据进行逻辑操作,但在操作前需要对它们进行逻辑类型转换。逻辑类型转换的规则是:对于算术型和枚举型,零转成false,非零转成true;对于指针型,空指针转成false,非空指针转成true

(4)       位操作的类型转换

对于逻辑位操作,编译程序将会按照常规算术转换规则对操作数进行类型转换,运算结果的类型与转换后的操作数类型相同。

对于移位操作,编译程序会对操作数按整型提升规则进行类型转换,运算结果的类型与第一个操作数类型(进行类型转换之后)相同。

(5)       赋值操作符的类型转换

对于赋值操作,当赋值操作的两个操作数类型不同时,编译程序将按赋值转换规则进行隐式类型转换,即把右边操作数转换成左边的操作数类型。在C++中,各种算术类型之间可以进行类型转换,其中,将实话类型转换成整型时,小数部分将舍去,并且不进行“四舍五入”。

(6)       条件操作符的类型转换

对于条件操作符,第一个操作数也可以是算术型、枚举型以及指针类型,编译程序对其进行逻辑转换:0转成false;非0转成true。第二,三个操作数可以是任意类型,当它们的类型不同时,编译程序将对它们进行类型转换。其中,对于算术类型和枚举类型,编译程序将按常规算术转换规则进行转换。条件操作的结果类型为转换之后的第二、三个操作数类型。

分享到:
评论

相关推荐

    C++/CLI教程

    13. 类型转换(Type Casts):包括显式和隐式类型转换,以及C++/CLI特有的装箱(Boxing)和取消装箱(Unboxing)操作。 14. 属性(Properties):C++/CLI中的属性(Properties)是一种用于封装字段访问的机制,允许...

    c++类的隐式转换与强制转换重载详解

    在写这篇文章之前,让我们先回顾一下编译器通过匹配过程确定调用哪一个函数的匹配顺序:(1)寻找和使用最符合函数名和参数类型...C语言编译系统提供的内部数据类型的自动隐式转换规则如下:1.程序在执行算术运算时,

    C++实例.docx

    《C++程序设计案例实训教程》是一本详细讲解C++编程的实践教程,分为四个主要部分,涵盖了C++过程程序设计、类型转换及流程控制、数组以及字符串等基础且核心的知识点。 在C++过程程序设计中,首先通过"Hello World...

    delphi与C++builder之间的转换

    2. **类型系统**:Delphi具有更为严格的类型系统,而C++支持更多类型的隐式转换。 3. **内存管理**:Delphi中的对象自动管理内存,而在C++中需手动管理。 4. **第三方库兼容性**:由于C++Builder支持更多的标准库和...

    C++primer读书笔记

    2. **类型转换**:C++提供了多种类型转换机制,包括隐式转换和显式转换,以适应不同的编程需求。 #### 高级主题 1. **智能指针与资源管理**:现代C++鼓励使用智能指针,如`unique_ptr`和`shared_ptr`,以自动管理...

    给C++初学者50个忠告

    22. 熟悉C++的类型转换,区分隐式转换和显式转换。 23. 学习C++中的文件操作,掌握如何读写文件。 24. 掌握C++的位操作,理解其在系统编程中的应用。 25. 学习使用断言(assert),确保程序的正确性。 26. 理解...

    Effective C++ Roy T 读书笔记。

    - 避免编写允许隐式类型转换的构造函数或operator=,这可能导致意料之外的行为。 10. **项10:优先使用pass-by-reference-to-const** - 当函数不修改参数时,使用const引用传递,既节省开销又明确表明参数不会被...

    c++关键字解释

    当一个构造函数只有一个参数或类型转换运算符只有一个返回类型时,如果没有显式标记,可能会发生不必要的隐式转换,导致意外的行为。 ### 20. export `export`关键字用于跨模块共享类型信息,但在实际中很少使用,...

    cpp代码-C和C++的不同-2-bool

    在C++中,`bool`类型可以与其他类型进行隐式转换。例如,任何非零值(包括浮点数)被视为`true`,而0被视为`false`。然而,这种自动转换在某些情况下可能会导致意外的结果,因此在编写代码时需要注意类型匹配。 ...

    C#的经典问题

    隐式转换(`implicit`)自动发生,无需程序员干预,而显式转换(`explicit`)需要显式调用,通常用于防止类型转换时的潜在数据丢失。 ### params关键字的用途 `params`关键字用于声明可接受不定数量参数的方法。当...

    C#程序学习教程

    - **6.1 隐式类型转换**:解释自动进行的类型转换过程。 - **6.2 显式类型转换**:演示如何使用强制类型转换来改变变量的类型。 - **6.3 小结**:总结不同类型转换的适用场景和注意事项。 ##### 第七章:表达式 - ...

    嵌入式Linux笔试题.pdf

    4. 语法一致性:保持类型一致性是编写健壮代码的基础,特别是在处理条件判断和计算时,确保所有操作数类型相同以避免隐式转换带来的问题。 5. 动态内存管理:在嵌入式Linux系统中,内存通常是受限资源。理解何时...

    C#完全中文手册

    - **6.1 隐式类型转换** - 描述自动发生的类型转换过程。 - **6.2 显式类型转换** - 讲解强制类型转换的语法和注意事项。 - **6.3 小结** - 概述不同类型转换的特点,强调正确使用类型转换的重要性。 ##### 第七...

    C#微软培训教材

    - **6.1 隐式类型转换**:介绍自动发生的类型转换规则。 - **6.2 显式类型转换**:讨论使用类型转换操作符进行强制转换的方法。 - **6.3 小结**:总结不同类型转换的特点和注意事项。 ##### 第七章:表达式 - **...

    C programming language

    2.7 类型转换:探讨了显式和隐式类型转换的机制,以及如何避免常见的类型不匹配错误。 2.8 自增与自减运算符:解释了++和--运算符的用途,包括前缀和后缀形式的区别。 2.9 位运算符:介绍了按位与、按位或、按位异或...

    C#语言教程

    - 总结了C#中的不同类型以及它们之间的转换机制。 ##### 第五章:变量和常量 - **5.1 变量** - 变量用于存储数据。 - C#中的变量必须先声明后使用。 - **5.2 常量** - 常量是在程序运行期间不会改变的值。 - ...

    运用X-mind线性思维对JAVA知识进行归纳

    9. **泛型**:泛型提供了一种在编译时检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。 10. **枚举与注解**:枚举类型用于定义有限的常量集合,注解则为代码提供了元数据,可以被编译器或...

    C#语言参考教程.pdf

    - **隐式类型转换**:描述了在不显式指定的情况下,C#如何自动进行类型转换,例如从int到long。 - **显式类型转换**:阐述了何时需要手动进行类型转换,以及如何避免因转换不当而导致的数据丢失或溢出。 #### 第七...

Global site tag (gtag.js) - Google Analytics