码迷,mamicode.com
首页 > 编程语言 > 详细

c++类型转换

时间:2018-02-22 19:36:59      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:地址   val   变量   执行   amp   根据   函数指针   pos   参数   

如果两种类型可以相互转换,它们就是关联的。c++语言不会直接将两种不同类型的值相加,而是先根据类型转换规则及那个运算对象的类型统一后再求值。

1、隐式转换

隐式转换的类型转换是自动执行的,无须程序员介入。在下面的情况下,编译器会执行隐式转换:

  • 大多数表达式中,比int类型小的整型值首先提升为较大的整数类型。
  • 条件表达式中,非布尔型转换成布尔型。
  • 初始化时,初始值变成变量类型。
  • 赋值语句中,右侧对象转换成左侧对象的类型。
  • 函数调用时发生的类型转换。

(1)算术转换

(1.1)整型提升

将小整数类型转换成较大的整数类型,对bool、char、signed char、unsigned char、short和unsigned short等类型来说,只要它们所有可能的值都存在int里,它们就会提升成int型,否则提升成unsigned int型;对较大的char类型(wchart_t、char16_t、char32_t)提升成int、unsigned int、long、unsigned long、long long和unsigned long long中最小的一种类型,前提是转换后的类型能容纳原类型所有可能的值。

(1.2)转换规则

算数转换将运算对象换成最宽的类型,比如表达式中既有整型又有浮点型,运算时会将整型变换成浮点型进行运算。算术运算首先执行整型提升,如果提升后的类型一致则不需要进一步的类型转换,否则要执行类型转换。如果运算对象符号一致,要么都是无符号的、要么都是有符号的,则小类型运算对象转换成较大类型。否则,符号不一致(含有无符号类型的)的运算则需要注意:

  • 无符号的类型不小于带符号类型的(无符号类型大),则带符号对象转换成无符号的。
  • 无符号类型小于带符号类型(无符号类型小),转换结果依赖机器:如果无符号类型的所有值都能存在该带符号类型中,则无符号对象转换成带符号类型,否则,带符号对象转换成无符号的类型。

(2)其他转换

  • 数组转换成指针

但当数组被用作decltype关键字的参数、取地址符(&)、sizeof、typeid等运算符的运算对象时,转换不会发生。

  • 函数类型自动转换成函数指针。
  • 算数类型或指针类型自动转换成布尔类型:

    char *cp=get_char();

    if(cp);//如果指针不是0,为真

    if(*cp);//如果指针指向的值不是空字符,为真

  • 非常量类型的指针(或引用)转换成常量类型:

    int i;

    const int &j=i;/非常量转换成常量的引用

    const int *p=&i;//非常量转换成指向常量的指针

  • 类类型定义的转换

  string s="a value";//字符串字面值转换成string类型

  while(cin>>s);//cin转换成bool值

2、显式转换

暂时不看

 

c++类型转换

标签:地址   val   变量   执行   amp   根据   函数指针   pos   参数   

原文地址:https://www.cnblogs.com/StormWendy/p/8459391.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!