写在前面:

太忙了,好久没有写博客。这篇文章是在下读C++ Primer中文第五版(与以往版本相比,第五版的一大特色就是“为新的C++11标准重新撰写”——引自封皮)时的笔记,没有什么技术含量,只是作为日后查阅的笔记资料,同时分享给需要的读者。

(1)类型选择

①当明确知道数值不可能为负时,用unsigned类型。

②对于整型,要么用int,要么用long long。short一般过小,当然,如果明确数据不会超过两字节,自然可以用,而long在许多编译器下和int等长。long long是C++11的新类型,是8字节的int。

③尽量使用signed char或unsigned char,而避免使用char。因为char在有些编译器下是无符号的,而在有些编译器下是有符号的。

④浮点运算用double。float与double的计算代价相差无几(甚至Primer上说有些机器上double比float还要快),但显然double精度高,而longdouble一般情况下又不必要。

注意:以上只是基于一般情况的建议,并不是一种规范,即只是建议这么做,而不是强制要求。

(2)使用注意:

①不要将bool值用于计算。如下面的代码

bool b = -;
int a = ;
cout << a + b << endl;

将得到结果11.

bool值只有0和1(true和false)两个值,如果将非0值赋给bool,编译器将该bool值视为1,如果将0赋给bool,编译器将该bool值视为0。

注:其实在下觉得这种情况在现实编程中几乎是不会出现的,这里只是拿来说一说将非bool值赋给bool值时编译器的处理方式。

②避免在同一个表达式中同时使用无符号数和有符号数。如下面的代码

unsigned int a = ;
int b = -;
cout << a + b << endl;

将得到结果4294967264.

原因是当有符号数与无符号数在一起运算时,有符号数将被视为无符号数。上面int b=-42在机器中用补码表示,而将其二进制补码视为无符号数,就是232-42=4294967276-42=4294967254,再加上a的值10,就是4294967264.

③不要将无符号数作为循环控制变量。如下面的代码

for (unsigned i = ; i >= ; --i)   //这里unsigned i被编译器默认解释为unsigned int i
{
cout << i << " ";
if ( == i)
{
cout << endl;
break;
}
}

将得到如下结果

原因同上,当i减为-1时,编译器认为是232 -1=4294967295,于是循环继续。显然,如果不是我们刻意加上break语句使i=-5(即编译器认为的4294967291)时退出循环,程序将陷入死循环。而如果我们不知道这是unsigned在作怪时,将会感到莫名其妙,不可思议,百思不得其解,直到抓狂。

可能有人会说把for循环改成for (unsigned i = 6; i > 0; --i)不就可以了吗?或者还有人会说:谁没事闲的会用unsigned类型作为循环控制变量呀?是的,的确是这样,但这并不代表我们总能清醒地避免上面的错误,尤其是当我们无意中“隐式地”使用unsigned类型作为循环控制变量的时候。(比如我们可能在程序的其它地方通过无符号整型计算得到一个值,而后来将这个值作为循环控制变量用在for或者while中)

所以,在下的建议就是:时刻牢记——除非出于特别需要,否则永远不要用无符号类型做循环控制变量。

后记:

尽管在下已做过校对,但错别字之类的错误纰漏仍在所难免,在恳请广大读者谅解的同时也欢迎大家批评指正。同时,如果您认为在下的文章中存在知识性错误,请您务必不吝赐教,在下先行谢过。您的批评指正就是在下不断进步的力量源泉。

您可能不曾注意的C++内置类型选择和使用的注意事项的更多相关文章

  1. golang的内置类型map的一些事

    golang的map类型是一个比较特殊的类型,不同于int, string, byte这样的基本类型,在经过一番探究之后得出了一些结论: 1.golang的map类型虽然是内置类型,但和基本类型有很大 ...

  2. JavaScript备忘录(1)——内置类型

    JavaScript有一些内置类型,还有很多常用的内置的方法,本文稍作总结,以备查阅. 值类型 我的理解,值类型是分配在栈上的,而引用类型(当然也包括引用类型内部的值类型)是分配在堆上的.值类型是不可 ...

  3. Python——内置类型

    Python定义了丰富的数据类型,包括: 数值型:int, float, complex 序列:(iterable) str, unicode, tuple, list, bytearray, buf ...

  4. C++内置类型对象之间的转换

    C++定义了一组内置类型对象之间的标准转换,在必要时它们被编译器隐式地应用到对象上. 隐式类型转换发生在下列这些典型情况下. 1. 在混合类型的算数表达式中 规则:在这种情况下最宽的数据类型成为目标转 ...

  5. C++ - 内置类型的最大值宏定义

    内置类型的最大值宏定义 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24311895 C++中, 常常会使用, 某些类型的最大值 ...

  6. C++基本内置类型

    C++基本内置类型 基本内置类型包括算术类型和空类型. 算术类型 算术类型包括整型和浮点型. 类型 含义 最小尺寸 bool 布尔型 - char 字符型 8 bit wchar_t 宽字符型 16 ...

  7. C++ 传参时传内置类型时用传值(pass by value)方式效率较高

    来源:唐磊的个人博客<C++ 传参时传内置类型时用传值(pass by value)方式效率较高> 在<Effective C++>里提到对内置(C-like)类型在函数传参时 ...

  8. 易被忽略的Python内置类型

    Python中的内置类型是我们开发中最常见的,很多人都能熟练的使用它们. 然而有一些内置类型确实不那么常见的,或者说往往会被我们忽略,所以这次的主题就是带领大家重新认识这些"不同寻常&quo ...

  9. Python isinstance 方法 判断 built-in types(内置类型)技巧

    Python isinstance 方法 判断 built-in types(内置类型)技巧 d = {} isinstance(d, type({})) isinstance(d, dict) l ...

随机推荐

  1. 高级java必会系列一:zookeeper分布式锁

    方案1: 算法思路:利用名称唯一性,加锁操作时,只需要所有客户端一起创建/test/Lock节点,只有一个创建成功,成功者获得锁.解锁时,只需删除/test/Lock节点,其余客户端再次进入竞争创建节 ...

  2. 自动打开Accesibility Service 可以自动安装APP

    package com.venscor.helloworld;import java.io.BufferedReader;import java.io.IOException;import java. ...

  3. Android JavaMail

    一.简介 JavaMail API提供了一种与平台无关和协议独立的框架来构建邮件和消息应用程序. JavaMail API提供了一组抽象类定义构成一个邮件系统的对象.它是阅读,撰写和发送电子信息的可选 ...

  4. android开发中的问题总结(一)

    1.设置sdk路径 window->preferences->android->SDK location 中进行修改,如果出现红叉,就说明不正确,选择的路径必须包含tools的那个目 ...

  5. C#类和接口

    1.类的定义 C#使用类关键字class定义类,如: public  class MyClass { } 2.类的继承 类继承使用: public class BaseClass { } public ...

  6. jQuery的13个优点

    1.轻量级 JQuery非常轻巧,采用Dean Edwards编写的Packer压缩后,大小不到30KB,如果使用Min版并且在服务器端启用Gzip压缩后,大小只有18KB. gzip: 每天一个li ...

  7. PHP 返回JSON

    有个朋友说PHP不能返回JSON对象,作为.net的我认为应该是可以的,设置一下header 就行了. 果不然,google 一下,备忘如下: <?php $result = array('Na ...

  8. win8.1中安装sql2014 0x800F0906 【 Error while enabling Windows feature : NetFx3, Error Code : -2146498298 】

    安装sql2012 需要安装net3.5  没有的话 安装不成功 Error while enabling Windows feature : NetFx3, Error Code : -214649 ...

  9. LigerUI 表单和表格中的combobox如何初始化值

    摘要: 在修改基础信息的时候,通常会遇到需要修改值为选择值的时候,这时候,数据库存的一般是value,而不是显示的text值,但页面显示的时候如果显示成数字型的值,通常会给人不够直观的感觉.因此,要求 ...

  10. python+selenium 浏览器的问题

    以前用selenium调用firefox是不需要驱动的,最近安装了python3.52+最新的firefox 发现调不起来了 搜索以后发现Firefox 47+需要搞个firefox的驱动 gecko ...