博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【共读Primer】8.[2.1] 基本内置类型(2) Page32
阅读量:4327 次
发布时间:2019-06-06

本文共 2735 字,大约阅读时间需要 9 分钟。

虽然C++中的类型是强制声明的,但是这并不意味着不同类型之间不可以进行一些计算或赋值。

我们来看下面的一组代码

1 #include 
2 3 int main() 4 { 5 bool b = 42; 6 int i = b; 7 double pi = i; 8 unsigned char c = -1; 9 signed char c2 = 256;10 std::cout << "bool b =" << b11 << "\nint i =" << i12 << "\ndouble pi =" << pi13 << "\nunsigned char c =" << (int)c14 << "\nsigned char c2 =" << (int)c2;15 }

上面的赋值语句中,没有一个是在把对应的值赋值给对应的类型。

但是并没有产生编译的错误,我们曾经说过,C++是一种强类型的语言。

这样胡乱的赋值感觉并不是强类型啊!

事情是这样的,类型指一个变量的类型,在声明的时候已经确定下来,在一定作用域内是不可以对类型进行改变的。

而类型之间可以赋值,是一种C++的特性,它称之为类型转换。

转换规则如下(敲黑板,记重点):

1. 非bool型赋值给bool型,0为false,其它为true

2. bool型赋值给非bool型,true为1,false为0

3. 把整形赋值给浮点型,整数部分相同,小数部分为零

4. 超过无符号类型的表示范围的赋值,取赋值数与该类型可表示最大数后为当前结果

5. 给带符号类型一个超出范围的值,结果是未定义的

 

虽然类型转换在很大程度上给了我们方便,但是这种方便却伴随着一些危险,比如以下程序:

1     int a = 42;2     if (a = 12) // 大家请注意这里,我觉得这种代码想要表达的意思应该是比较,而不是赋值,所以这里应该是a == 123     {4         std::cout << "\nis true" << std::endl;5     }6     else7     {8         std::cout << "\nis false" << std::endl;9     }

将这段代码并入上一段程序中共同编译运行,结果如下:

大家看一下代码的运行结果,少些一个=号,从编译到运行都没有问题,但是结果却不是我们想要的。

所以大家一定要深刻的掌握类型转换的过程,特别是编译器自作主张给我们做的转换,如果不知道什么原因是非常危险的。

另外分享一个小技巧:上述情况想要避免很容易,把常量写在=的前面  if ( 12 == a ) 这样写就不会出现我们刚才描述到的现象。

因为如果在这种情况下你只写了一个等式,那么会有编译错误,根本无法生成可执行文件

在上一章的内容中我们了解到了无符号类型和有符号类型,那么关于这两种的类型转换会有什么样的转换过程需要去注意

下面还是来看一段代码,然后我们在分析一下:

1     unsigned int u = 10; 2     int i = 42; 3     std::cout << "i + i = "<< i + i << std::endl;    // 结果正确 4     std::cout << "u + i = " << u + i << std::endl;    // 结果为 4294967264 5      6     unsigned int u1 = 42, u2 = 10; 7     std::cout << "u1 - u2 = "<< u1 - u2 << std::endl;    // 结果正确 8     std::cout << "u2 - u1 = "<< u2 - u1 << std::endl;    // 结果正确但是是取模后的值 9     10     11     12     for (int i = 10; i >=0; --i) // 一个正常的循环,循环10次结束13     {14         std::cout << i << std::endl;15     }16         17     for (unsigned int i = 10; i >=0; --i) // 一个死循环,i永远无法小于零,所以一直循环18     {19         std::cout << i << std::endl;  20     }21

如果要编译以上代码,记得将无限循环注释掉,或者给一个循环退出条件。

无符号类型与有符号类型负数相加,首先吧负数转换为无符号,然后相加,所以的数非常的大

 

当从无符号书中减去一个值时,不管这个值是什么都必须确保不能是一个负数

 

所以这里给大家的一个忠告,一定要记住,带符号和无符号的千万不要一起进行运算。

1 20 /*十进制数*/ 2 024 /*八进制数*/ 3 0x14 /*十六进制数*/ 4  5 //浮点型可以用科学计数法表示 6 3.14159   3.14159E0   0.   0e0   .001 7  8 // 用引号括起来的是字符,双引号括起来的是字符串 9 ‘a’    // 字符字面值10 "Hello World!" // 字符串字面值11 12 // 转移序列13 14 \n // 换行符15 \v // 横向制表符16 \\ // 反斜线17 \r // 回车符18 \t // 横向制表符19 \b // 退格符20 \? // 问号21 \f // 进纸符22 \a // 报警符23 \" // 双引号24 \' // 单引号25 26 // 指定字面值的类型27 L'a' // 宽字符型字面值,类型是wchar_t28 u8"hi!" // utf-8自穿穿字面值29 42ULL // 无符号整形字面值,类型是unsigned long long30 1E-3F // 单精度浮点型字面值,类型是float31 3.14159L // 扩展精度字面值,类型是long double32 33 // bool 字面值34 true  false35 36 // 指针字面值37 nullptr

以上这些都是字面值类型以及写法。

 

转载于:https://www.cnblogs.com/ChattyKu/p/9410757.html

你可能感兴趣的文章
网络抓取功能实现 将获取的结果进行过滤并写入到TXT文档中
查看>>
暑假集训-7.31总结
查看>>
安卓:动态注册广播
查看>>
Oracle系列--基础理论
查看>>
广州.NET微软技术俱乐部微信群各位技术大牛的blog
查看>>
npm安装vue-cli时速度慢,fetchMetadata经常卡住并报异常
查看>>
POJ:1703-Find them, Catch them(并查集好题)(种类并查集)
查看>>
HDU:5040-Instrusive
查看>>
校验器
查看>>
thread/threading——Python多线程入门笔记
查看>>
linux 命令汇总(搜索、fdfs、常用命令),虚拟机dump文件
查看>>
Nginx 反向代理解决浏览器跨域问题
查看>>
为什么现在我最终推荐内存OLTP
查看>>
git error: failed to push some refs to...
查看>>
Markdown指南
查看>>
influxDB的安装和简单使用
查看>>
JPA框架学习
查看>>
JPA、JTA、XA相关索引
查看>>
机器分配
查看>>
php opcode缓存
查看>>