关于隐式转换和显式转换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于隐式转换和显式转换相关的知识,希望对你有一定的参考价值。

今天刚开始学C#..我实在是不明白这两个的区别 麻烦明白的达人解答一下
书上关于显式转换给了这么个例子
int count = 10;
string Scount = count.ToString();//数值到字符串的显式转换
string data = "50";
int Idata = int.Parse(data);//字符串到数值的显示转换
哪位达人给解答一下 这到底是表达的什么..
隐式转换书上给的例子
int count = 9;//定义整型
float fcount = count;//隐式转换为浮点型
label2.Text=fcount.ToString();//输出浮点型变量内容
也不太明白....

1、代码的部分解释:

string Scount = count.ToString();这里.ToString()方法就是手动写的

int count = 9;

float fcount = count;这个就是两个变量直接赋值,不需要其他的动作。

2、显式转换, 就是强制转换. 在被转换的表达式前加(类型),比如:

(float)5,就是把5显式转换成float类型。

3、隐式转换, 就是不需要加强制转换, 系统会自动做这个操作,比如:

double k;

k=10;

10是int型, 不需要显式转换, 系统自动会把它转为10.0

扩展资料:

隐式自动类型转换:

C++语言编译系统提供的内部数据类型的隐式自动转换规则如下:

1、执行算术自运算时,低类型(短字节)可以转换为高类型(长字节);例如: int型转换成double型,char型转换成int型等等;

2、赋值表达式中,等号右边表达式的值的类型自动隐式地转换为左边变量的类型,并赋值给它;

3、函数调用时,将实参的值传递给形参,系统首先会自动隐式地把实参的值的类型转换为形参的类型,然后zd再赋值给形参;

4、函数有返回值时,系统首先会自动隐式地将返回表达式的值的类型转换为函数的返回类型,然后再赋值给调用函数返回。

参考技术A 简单的说
显式就是需要你手动写代码转换的
隐式就是两个变量之间可以直接相互赋值的
string Scount = count.ToString();
这里.ToString()方法就是手动写的

int count = 9;
float fcount = count;
这个呢 就是两个变量直接赋值 不需要其他的动作
当然 float和int两种类型值的范围不同
float隐式转换成int有可能丢失精确度
参考技术B int count = 10;
string Scount = count.ToString();//数值到字符串的显式转换
string data = "50";
int Idata = int.Parse(data);//字符串到数值的显示转换

10-"10"
"50"-50
int count = 9;//定义整型
float fcount = count;//隐式转换为浮点型
label2.Text=fcount.ToString();//输出浮点型变量内容
9-9.0000(几位忘了)本回答被提问者采纳
参考技术C 个人认为哈,显示转换是小的(所占内存)转换成一个大的(所占内存)这类转换需要特定的语法进行。隐式转换就是大的转换成小的了,这类转换可以默认进行。

隐式转换和显式转换

C/C++对于数据类型的转换包括隐式转换和显式转换(强制类型转换)。

一般来说,隐式转换包括以下几种情形:

1. 低精度与高精度混合运算,低精度会隐式转换成高精度类型。

int a = 10;
double b = 1.2;
double c = a + b;//此时a会隐式转换成double类型进行运算。

bool、char、short、int、long、float、double依次向上会发生隐式转换。bool类型向上转换时,false转换成0,true转换成1。

【p.s.】有符号和无符号数之间的转换。当signed类型能够容纳类型转换前的数时,该类型向上转换时转换为signed类型,否则都转换成unsigned类型。

有符号数和无符号数之间的转换会发生符号反转或数据截断。

符号反转是只无符号数与有符号数之间运算,会导致符号发生变化;

数据截断则是指高精度数据用低精度类型保存数据时,发生的高位/低位数据被舍弃的现象。

int a = 300;
char b = a;//发生数据截断 b的ascii码是44,实际对应的是,
int c = b;//char隐式转换成int 44

unsigned short d = 10;
unsigned short e = 65535;
short f = d + e;//65545,被截断f=9

short aa = 10;
short bb = 32767;
short cc = aa + bb;// cc=-32759

 

2. 非布尔类型会转换成布尔类型。

int a = 10;
if (a)//这里会将非0值认为是true
{
    cout << "i am true."  << endl;
}
else
{
    cout << "i am false." << endl;
}

 

3. 指针类型转换。

数组名会转换成指针。当数组作为函数形参时,本身是蜕化成指针的。

可以将NULL(0)赋值给指针类型。

 

4. 枚举类型。

枚举类型的取值可以与整形进行转换。

 

C风格的强制转换,在类型前加上(c_type)。如,将double类型强制转换成int:

double pi = 3.1415926;
int p = (int) pi;// p = 3

C++风格的强制转换

static_cast<type>、const_cast<type>、dynamic_cast<type>、reinterpret_cast<cast>

通常编译器支持的自动转换,都可以在前面加上static_cast。高精度数据转换成低精度数据时,编译器通常会给出精度损失的告警,
使用static_cast强制转换时,编译器就会忽略这个告警。常用如下:

void *p;
double *q = static_cast<double*> (p);//支持指针的强制转换
 
double Pi= 3.1415926;
int pi = static_cast<int> (Pi);//此处不会有warning

const_cast能够将变量的const属性去除。如一个函数的入参是 char*类型,当传入一个const char*时,编译会报错。这时可以使用const_cast去除它的const属性。

  #include <iostream>
  using namespace std;
  
  void print(char* s)
  {
      cout << s << endl;
  }
  int main()
  {
      const char* s = "abc";
      print(const_cast<char*> (s));//去除s的const属性
      return 0;
  }

 

dynamic_cast支持运行时识别指针或引用类型所指向的对象。

dynamic_cast使用时先去判断转换是否有效,有效才进行转换。

转换对象是指针时,若转换失败,则转换的结果是NULL指针;若转换对象是引用,若转换失败,则抛出一个bad_cast的异常。

 

reinterpret_cast通常是在位操作层次上进行的强制转换。转换后一定要记住原始类型,保证后续操作兼容原始类型,否则可能会造成一些奇怪的输出结果。

 int *ip;
 char *pc = reinterpret_cast<char*> (ip);
 //Coder一定要记住pc所指向的对象实际是int类型的。
 
 string s(pc);//这里s里面的内容很奇怪。

 

以上是关于关于隐式转换和显式转换的主要内容,如果未能解决你的问题,请参考以下文章

隐式转换和显式转换及强制转换的区别

C#中的类型转换-自定义隐式转换和显式转换

Oracle sql中的隐式和显式数据类型转换有啥区别

C语言 显式 隐式是啥意思

C#类型转换总结

C#类型转换总结