zoukankan      html  css  js  c++  java
  • 您可能不曾注意的C++内置类型选择和使用的注意事项

    写在前面:

    太忙了,好久没有写博客。这篇文章是在下读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 = -10;
    int a = 10;
    cout << a + b << endl;

    将得到结果11.

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

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

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

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

    将得到结果4294967264.

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

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

    for (unsigned i = 5; i >= 0; --i)   //这里unsigned i被编译器默认解释为unsigned int i
        {
            cout << i << "  ";
            if (4294967291 == 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中)

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

    后记:

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

  • 相关阅读:
    DataRabbit 轻量的数据访问框架(14)-- DataRabbit 3.0 与 Linq to sql 性能比较
    通过Spring.net发布Remoting
    项目经理的职责
    DataRabbit 轻量的数据访问框架(15)-- IOrmAccesser的BatchInsert批量插入!
    【网络游戏专题】时间同步装置
    使用动态代理,提高工作效率
    总裁与专才
    Socket与拔掉网线
    索朗旺姆光
    TCP连接与防火墙
  • 原文地址:https://www.cnblogs.com/zpcdbky/p/4896140.html
Copyright © 2011-2022 走看看